2011-05-20 16 views
5

जब मैं कार्य करें:पर्ल 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:]]' को प्रतिस्थापित करें।

+0

यदि आप अपने स्रोत कोड में शाब्दिक यूटीएफ -8 का उपयोग करते हैं, तो आपको केवल स्कोप में 'utf8' उपयोग' की आवश्यकता है। पर्ल इसे आपके लिए डीकोड करेगा। – tchrist

उत्तर

6

पर्ल 5.14 से पहले, यह बहुत अच्छी तरह से परिभाषित नहीं किया गया था।

5.14 के साथ

, पैटर्न में जाना जाता है कि यह कैसे संकलित किया गया है, और आप /u, /l, /d, /a, या /aa पैटर्न संशोधक है। आप यह भी कह सकते हैं

use re "/u"; 

या

use re "/msu"; 

शाब्दिक दायरे में पर उन सभी झंडे चालू करने के लिए।

उदाहरण के लिए, 5.14 के तहत:

% perl -le 'print qr/foo/' 
(?^:foo) 
% perl -E 'say qr/foo/' 
(?^u:foo) 
% perl -E 'say qr/foo/l' 
(?^l:foo) 

मैं स्थान स्पष्ट stear होगा; बस सभी यूनिकोड का उपयोग करें।

बीटीडब्लू, मैं यह सुनिश्चित कर दूंगा कि "बाहरी स्रोत" ने आपको एक स्ट्रिंग वापस दे दी जो उचित रूप से डीकोड किया गया था; यानी, इसका यूटीएफ 8 झंडा चालू है। चरित्र कार्य एन्कोडेड तारों पर खराब काम करते हैं, क्योंकि वे वास्तव में इसके बजाय डिकोडेड स्ट्रिंग चाहते हैं।

+1

तो, perl <5.14 में utf8 से मिलान करने का सही तरीका क्या है [: ऊपरी:]? कुछ ऐसा: "मेरा $ regsrc = एनकोड :: decode_utf8 ('[[: ऊपरी:]]'); मेरा $ regex = qr/$ regsrc /; # या कैसे? या शुरुआत में" utf8 का उपयोग करें; "पर्याप्त है? – kobame

+0

'utf8' का उपयोग यू +80-यू + एफएफ पर अपने स्रोत कोड के लिए यूनिकोड स्ट्रिंग्स अर्थशास्त्र प्राप्त करने के लिए पर्याप्त नहीं है। आपको' utf :: upgrade ($ string) 'कहने में सक्षम होना चाहिए। यह मानता है कि स्ट्रिंग है पहले से ही डीकोड किया गया है, या फिर यूटीएफ -8 का सही एन्कोडिंग है और यदि ऐसा है तो इसे डीकोडेड के रूप में चिह्नित किया जाता है। फिर किसी भी रेगेक्स को उस पर सही काम करना चाहिए। आप इसका उपयोग करने के लिए 'utf8 :: is_utf8 ($ string)' का उपयोग कर सकते हैं कि इसके यूटीएफ 8 ध्वज पहले से ही चालू है। यूनिकोड प्रॉपर्टी '\ p {upper} 'यूनिकोड सेमेन्टिक्स मान लेगी, लेकिन फिर से यह आवश्यक है कि बाइट स्ट्रिंग्स को पहले ही चरित्र तारों में परिवर्तित कर दिया गया हो। मैं कभी भी' [[: upper:]]' , व्यक्तिगत रूप से – tchrist

+0

पसंद करें [यूनिकोड :: सेमेन्टिक्स] (http://p3rl.org/Unicode::Semantics) केवल नग्न 'अपग्रेड' एपीआई कॉल पर। कोई 'is_utf8' परीक्षण आवश्यक नहीं है। – daxim

संबंधित मुद्दे