Когда я делаю:
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 должен знать, что такое верхний регистр. Зависит от настроек локали? Если да, как сопоставить прописную букву 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 replace «[[: upper:]]» на основе флага utf8 совпавшей строки $.