2009-06-04 7 views
24

क्या पर्ल में रेगेक्स को प्रीकंपाइल करने का कोई तरीका है? मेरे पास एक ऐसा प्रोग्राम है जिसे मैं प्रोग्राम में कई बार उपयोग करता हूं और यह उपयोगों के बीच नहीं बदलता है।क्या पर्ल में रेगेक्स को प्रीकंपाइल करने का कोई तरीका है?

उत्तर

57

शाब्दिक (स्थैतिक) regexes के लिए कुछ भी करने के लिए नहीं है - perl केवल उन्हें एक बार संकलित करेगा।

if ($var =~ /foo|bar/) { 
    # ... 
} 

चर में संग्रहीत रेगेक्स के लिए आपके पास कुछ विकल्प हैं। आप एक regex वस्तु का निर्माण करने के qr// ऑपरेटर का उपयोग कर सकते हैं:

my $re = qr/foo|bar/; 

if ($var =~ $re) { 
    # ... 
} 

यह आसान है आप कई स्थानों में एक regex का उपयोग करें या यह सबरूटीन्स को पारित करने के लिए चाहते हैं।

regex पैटर्न एक स्ट्रिंग में है, तो आप पर्ल है कि यह कभी नहीं बदल जाएगा वादा करना /o विकल्प का उपयोग कर सकते हैं:,

my $pattern = 'foo|bar'; 

if ($var =~ /$pattern/o) { 
    # ... 
} 

यह आमतौर पर बेहतर है ऐसा नहीं है, हालांकि। पर्ल यह जानकर काफी समझदार है कि परिवर्तनीय नहीं बदला है और रेगेक्स को फिर से सम्मिलित करने की आवश्यकता नहीं है। /o निर्दिष्ट करना शायद एक समयपूर्व माइक्रो-अनुकूलन है। यह भी एक संभावित नुकसान है। यदि परिवर्तनीय /o का उपयोग कर बदल गया है तो वैसे भी पुराने regex का उपयोग करने के लिए perl का कारण बन जाएगा। इससे बग का निदान करना मुश्किल हो सकता है।

+3

ये सच हैं; हालांकि, qr // को कई सालों से समर्थित किया गया है (यह 5.005 के बाद से अस्तित्व में है, और मुझे लगता है कि 5.8 के बाद से इसमें कोई समस्या नहीं है) – ephemient

+8

@ephemient Well, 5.10 में एक खराब स्मृति रिसाव qr // से जुड़ा हुआ है (और संकलन संकलन सामान्य रूप से), लेकिन यह तय किया गया है। यदि आप 5.10 का उपयोग कर रहे हैं, तो आप यह देखने के लिए जांच सकते हैं कि क्या आपके पास perl -e 'qr // जबकि 1' कहकर मेमोरी लीक है या नहीं। मुझे पता है कि ActiveState Perl 5.10 का ओएस एक्स संस्करण अभी भी टूटा हुआ है। –

+2

2016 से नोट: '/ o' संशोधक को बहिष्कृत कर दिया गया है। विवरण के लिए [यह प्रश्न] देखें (http://stackoverflow.com/q/550258/477563)। –

19

सरल: qr // ऑपरेटर की जांच करें (perlop में Regexp Quote-Like Operators के तहत दस्तावेज़ित)।

my $regex = qr/foo\d/; 
$string =~ $regex; 
+0

अच्छा, ऐसा लगता है कि एस /// निर्माण में एक पैटर्न के रूप में उपयोग किया जा सकता है। क्या यह अभी भी पूर्व संकलित है या फिर इस मामले में इसे संकलित किया गया है? – akostadinov

+0

@akostadinov यह अभी भी पूर्व संकलित है। –

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