文字クラスと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は無視するとして、
判定動作がうまくいっていることがわかる。