PerlでShiftJIS::Regexpモジュールを使う際の注意点

2バイト文字のコードにエスケープ文字コード「0x5c」(¥または\)が含まれるいわゆる「ダメ文字」をマッチングパターンに使う際、文字データをそのまま使うと意図したマッチング結果にならない場合がある。
そこで、これを避けるためにマッチングパターンに含まれる2バイト文字(0x8140-0xfcfc)を全て文字コード表記「¥x{????}」に変換すると、意図したマッチング結果が得られる事が分かった。

$pattern =~ s/([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])/'\\'.'x'.'{'.unpack('H*',$&).'}'/goe;
replace(\$before, $pattern, $after, 'g');

上記の文字列「([¥x81-¥x9f¥xe0-¥xfc][¥x40-¥x7e¥x80-¥xfc])」は、ShiftJIS::Regexpモジュールを使った以下の処理でも似たパターンを得られる。

re('([\p{Zenkaku}])')