當我這樣做:Perl的正則表達式預編譯 - UTF8
use strict; use warnings;
my $regex = qr/[[:upper:]]/;
my $line = MyModule::get_my_line_from_external_source(); #file, db, etc...
print "upper here\n" if($line =~ $regex);
怎樣使用Perl會知道什麼時候它只能ascii uppercase
當utf8 uppercase
匹配嗎? 這是一個預編譯的正則表達式 - 所以有些Perl必須知道,什麼是大寫。取決於區域設置?如果是,如何將「C」語言環境中的utf8大寫與預編譯的正則表達式匹配?
更新基於tchrist的評論:
use strict; use warnings; use Encode;
my $regex = qr/[[:upper:]]/;
my $line = XXX::line();
print "$line: upper1 ", ($line =~ $regex) ? "YES" : "NO", "\n";
my $uline = Encode::decode_utf8($line);
print "$uline: upper2 ", ($uline =~ $regex) ? "YES" : "NO", "\n";
package XXX;
sub line { return "alpha-Ω"; } #returning octets - not utf8 chars
輸出是:
alpha-Ω: upper1 NO
alpha-Ω: upper2 YES
是什麼意思,是預編譯的正則表達式是不是「硬預編譯」,而是「軟預編譯」 - 所以perl根據匹配的$行的utf8標誌替換'[[:upper:]]'。
如果您在源代碼中使用文字UTF-8,那麼您只需要在作用域中使用「utf8」。 Perl會爲你解碼。 – tchrist 2011-05-20 14:09:46