当我这样做: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