文字クラスとutf8フラグ
文字の集合を1文字として表現する文字クラス。
ASCIIは基本うまく動くんだけど、
Unicode文字に、標準ではうまく動作してくれなかった。
以下その例。
{ my $HIRAGANA = 'あいうえお'; my $KANJI = '漢字'; if ($HIRAGANA =~ m{\A [あ-お]+ \z}xms) { print STDERR qq{あ-おマッチ\n}; } if ($HIRAGANA =~ m{\A [^あ-お]+ \z}xms) { print STDERR qq{あ-お以外\n}; } if ($KANJI =~ m{\A [^あ-お]+ \z}xms){ print STDERR qq{(漢字)あ-お以外\n}; } }
結果
あ-おマッチ
漢字に対して、あ〜お以外の1文字以上から構成されているはずの判定がうまくいかない。
この問題は、use utf8 とすれば、うまくいくようになる。
{ use utf8; my $HIRAGANA = 'あいうえお'; my $KANJI = '漢字'; if ($HIRAGANA =~ m{\A [あ-お]+ \z}xms) { print STDERR qq{あ-おマッチ\n}; } if ($HIRAGANA =~ m{\A [^あ-お]+ \z}xms) { print STDERR qq{あ-お以外\n}; } if ($KANJI =~ m{\A [^あ-お]+ \z}xms){ print STDERR qq{(漢字)あ-お以外\n}; } }
結果
Wide character in print at not.pl line 14. あ-おマッチ Wide character in print at not.pl line 22. (漢字)あ-お以外
utf8フラグが付いたまま出力されていることによる、Wide Character warningは無視するとして、
判定動作がうまくいっていることがわかる。