Когда я сделаю:
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 совпадающей строки $.