perlの文字列のパターンマッチが上手く行かない時

投稿日: 更新日:

ハマったのでメモ。

次のようなコードを実行した際、上手くマッチしない場合がある。

$str = [DBから取ってきた文字列];
$ptn = '携帯';

if ( $str =~ /$ptn/){
print 'Match.';
}
else{
print 'Unmatch.';
}

この時、$str,$ptnをprintで標準出力に表示してみると、意図しない文字列になっている事がある。

この場合、次のように変更して改善される場合がある。

use Encode qw(decode encode);

$str = [DBから取ってきた文字列];
$ptn = decode('utf8','携帯');

if ( $str =~ /$ptn/){
print 'Match.';
}
else{
print 'Unmatch.';
}

ポイントは、文字列を保持している変数が、実際は文字列 or バイト列のどちらの形で文字列を持っているか、という事。

参考

日本語や絵文字などのマルチバイト文字を扱う作法|Perlの今

関連するタグ

perl