Perlでの全角半角変換
Perl
Perlを使って英数字記号およびカタカナの全角/半角の変換を行う時のメモ。
というか、いまいちスッキリしなかったので、途中経過としての記録。
Jcode
一番スタンダードなのがJcodeを使う方法。
特に、Perl-5.6以前はJcode.pmもしくはjcode.plを使うのが定石で、現状でも古いコードを保守する際には非常に重宝する。
ただし、Jcodeは内部コードがeuc-jpであることが前提として作られているせいか、utf8でtr等を使用するとうまく変換されない。
従って、内部コードがutf8となったPerl5.8以降では、もはや主流からは外れていると行って良いと思う。
使用例:
require 'jcode.pl'; jcode::tr(\$str, '0-9A-Za-z', '0-9A-Za-z');
tr
Perl-5.8以上であれば、utf8の文字列は普通に全角でもtrで変換できる。
ただし、明示的にuse utf8しないと動作しないのと、use utf8するので出力時にはbinmodeで明示的にutf8を指定しないといけないので少々面倒。
さらに、半角カナには対応していないので、半角カナに対応するには別途モジュール等が必要。
使用例:
use utf8; binmode STDOUT, ":utf8"; $str =~ tr/0-9A-Za-z/0-9A-Za-z/; print $str;
Unicode::Japanese
本当は、軽量なLingua::JA::Regular::Unicodeの方が良いと思うが、個人的にはUnicode::Japaneseが現状では一番使いやすいと思うので、何も考えずにUnicode::Japaneseを使っています。
使用例:
use Unicode::Japanese; print Unicode::Japanese->new($str)->z2h->get;
Lingua::JA::Regular::Unicode
全角/半角の変換に特化したモジュールなので、非常に軽量。
現状、これがスタンダードといってよいと思うのだが、このモジュールもuse utf8;しないと動作しないのが少々面倒。
※この点はドキュメントには書かれていないように見える。
また、ドキュメントによると、以下のようにuseされているが、Version-0.03時点では、実際にこのように指定するとエラーとなる。
use Lingua::JA::Regular::Unicode qw/regular/;
使用例:
use utf8; use Lingua::JA::Regular::Unicode qw/alnum_z2h/; binmode STDOUT, ":utf8"; print alnum_z2h($str);