Предварительно скомпилированное регулярное выражение 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 в верхнем регистре , а когда в верхнем регистре utf8 ? Это предварительно скомпилированное регулярное выражение, поэтому некоторые Perl должны знать, что такое верхний регистр. Зависит от настроек локали? Если да, как сопоставить верхний регистр utf8 в локали "C" с предварительно скомпилированным регулярным выражением?

обновлено на основе комментариев 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 заменит '[[: upper:]]' на основе флага utf8 совпадающей строки $.

5
задан tchrist 4 April 2015 в 18:17
поделиться