Perl预编译正则表达式 - utf8

kob*_*ame 5 regex unicode perl utf-8

当我做:

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 );
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

输出是:

alpha-?: upper1 NO
alpha-?: upper2 YES
Run Code Online (Sandbox Code Playgroud)

这是什么意思,预编译的正则表达式不是"硬预编译"而是"软预编译" - 所以perl根据匹配的$ line的utf8标志替换'[[:upper:]]'.

tch*_*ist 6

在Perl 5.14之前,这个定义不是很明确.

随着5.14,称为模式如何被编译,和你有/u,/l,/d,/a,或/aa模式修饰.你也可以说

use re "/u";
Run Code Online (Sandbox Code Playgroud)

要么

use re "/msu";
Run Code Online (Sandbox Code Playgroud)

在词法范围内打开所有这些标志.

例如,在5.14下:

% perl -le 'print qr/foo/'
(?^:foo)
% perl -E 'say qr/foo/'
(?^u:foo)
% perl -E 'say qr/foo/l'
(?^l:foo)
Run Code Online (Sandbox Code Playgroud)

我会避开场所; 只需使用全Unicode.

顺便说一句,我会确保那个"外部源"给你一个正确解码的字符串; 也就是说,它的UTF8标志已打开.字符函数在编码字符串上运行不佳,因为它们确实需要解码字符串.