जब मैं कार्य करें:पर्ल precompiled regex - 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);
पर्ल कैसे पता है जब यह केवल ascii uppercase
और जब utf8 uppercase
से मेल खाना चाहिए होगा? यह एक precompiled regex है - तो कुछ हद तक perl पता होना चाहिए, अपरकेस क्या है। लोकेल सेटिंग्स पर आश्रित? यदि हां, precompiled regex के साथ "सी" लोकेल में 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
इसका क्या मतलब है, कि precompiled regex नहीं है 'कड़ी मेहनत से precompiled' लेकिन 'नरम-precompiled' - इसलिए मिलान $ 1 के utf8 ध्वज के आधार पर '[[: upper:]]' को प्रतिस्थापित करें।
यदि आप अपने स्रोत कोड में शाब्दिक यूटीएफ -8 का उपयोग करते हैं, तो आपको केवल स्कोप में 'utf8' उपयोग' की आवश्यकता है। पर्ल इसे आपके लिए डीकोड करेगा। – tchrist