PerlでCP932文字コードの2バイト文字によるマッチングを行う
Perlで全角2バイト文字をマッチングすると、CP932(ShiftJIS)環境では文字区切りが存在しないため、誤判定や文字化けの元になる。
UTF8にコード変換すれば一発で解決するが、機種依存文字などの特殊文字や、複数の区分に重複登録されている文字などの関係で、内容が意図せずに変わってしまう危険性を孕んでいるため、どうしてもコードを変えたくない場合がある。
そこで、全角2バイト文字を1文字として扱うために、以下のページを参考に、ShiftJIS::Regexpモジュールを導入。
ShiftJIS::Regexp - Shift-JISで書かれた正規表現
以下のコードを実行してみる。(文字コードはCP932)
#! C:/Perl/bin/perl use strict; use warnings; use ShiftJIS::Regexp qw(:all); use Dumpvalue; my $text = 'あああいいいうううえええおおお'; my $reg_before = '[いお]'; my $reg_after = 'え'; print $text . "\n"; replace(\$text, $reg_before, $reg_after, 'g'); print $text . "\n";
出力は以下のようになる。
あああいいいうううえええおおお あああえええうううええええええ
文字列置換の他にも、マッチングや分割など、2バイト文字向けのモジュールが揃えられており、使い方は今までとあまり変わらないので、使わない手は無い。