古い Perl 3.0 の時代には、すべてが ASCII であり、Perl はそれを反映していました。\w
と同じ意味[0-9A-Z_a-z]
でした。そして、私たちはそれが好きでした!
ただし、Perl はもはや ASCII にバインドされていません。私が[a-z]
書いたプログラムが英語以外の言語で動作しないと怒鳴られたので、しばらく前に使用をやめました。この世界には英語を話さない人が少なくとも数千人いることを知って、アメリカ人としての私の驚きを想像したに違いありません。
[0-9A-Z_a-z]
とにかく、Perl にはより良い処理方法があります。セットを使用することも、[[:alnum:]]
単に\w
正しいことを行うものを使用することもできます。小文字のみを使用する必要がある場合は、[[:lower:]]
代わりに[a-z]
(英語タイプの言語を想定) を使用できます。(Perl は、EBCDIC プラットフォームでも [az] が 26 文字の a、b、c、... z を意味するようにするために、ある程度の努力をします。)
ASCII のみを指定する必要がある場合は、/a
修飾子。ロケール固有を意味する場合は、「使用ロケール」のレキシカル スコープ内で正規表現をコンパイルする必要があります。(正規表現パターンにのみ適用される /l 修飾子は避けてください。たとえば、's/[[:lower:]]/\U$&/lg' では、パターンはロケールを使用してコンパイルされます。しかし \U はそうではありません. これはおそらく Perl のバグと考えるべきでしょう. しかし, これが現在の仕組みです. /l 修飾子は実際には内部的な簿記のみを目的としており, 直接入力するべきではありません.) 実際には,プログラムへの入力時にロケール データを変換し、内部で Unicode を使用しながら、出力時に変換し直すことをお勧めします。あなたのロケールが最新の UTF-8 の 1 つである場合、5.16 の新機能「use locale ":not_characters"」
$word =~ /^[[:alnum:]]+$/ # $word contains only Posix alphanumeric characters.
$word =~ /^[[:alnum:]]+$/a # $word contains only ASCII alphanumeric characters.
{ use locale;
$word =~ /^[[:alnum:]]+$/;# $word contains only alphanum characters for your locale
}
さて、これはバグですか?プログラムが意図したとおりに動作しない場合、それは単純明快なバグです。本当に ASCII シーケンスが必要な場合[a-z]
は、プログラマは修飾子を使用[[:lower:]]
する必要があります。/a
他の言語の小文字を含むすべての可能な小文字が必要な場合は、単純に を使用する必要があります[[:lower:]]
。