2009-12-02 13 views
15

qr/STRING/ के लिए docs कहते हैं:पर्ल में qr/STRING/ऑपरेटर यह तय करता है कि STRING को संकलित करना है या नहीं?

इस ऑपरेटर उद्धरण (और संभवतः संकलित) एक नियमित अभिव्यक्ति के रूप में अपनी STRING

मुझे चिंताएं हैं कि मुझे कोष्ठक में हिस्सा क्या है। मैं किसी भी मामले के बारे में नहीं सोच सकता जहां मैं नहीं चाहता कि यह STRING से एक रेगेक्स संकलित करे। क्या यह मूलभूत बयान सिर्फ कुछ ऐसे मामले को कवर करने के लिए वीज़ल शब्द है जहां संकलन वांछित नहीं है या आज कोई मामला है (या पर्ल के पहले संस्करण में) जहां STRING संकलित नहीं किया जाएगा?

+9

"वीज़ल शब्द"? हमारे पवित्र ग्रंथों में? आप मज़ाक कर रहे हैं। – innaM

+2

हां, वे वीज़ल शब्द हैं। – ysth

उत्तर

13

"संभवतः संकलित" प्रलेखन का हिस्सा शायद नीचे दिखाया गया है एक है, जहां qr// को तर्क इस तरह की स्थितियों को दर्शाता है: उदाहरण के लिए, आपको लूप से प्रत्येक यात्रा पर इस पद्धति पुनः संकलित की जरूरत नहीं है एक पहले से संकलित रेगेक्स है:

use re 'debug'; 

$re1 = qr/foo/; 
$re2 = qr/$re1/; 

उस प्रोग्राम को चलाने से केवल एक रेगेक्स संकलित किया जा रहा है।

उस मार्ग के इरादे के बावजूद, आंतरिक विवरणों के लिए भरोसेमंद संकेत दस्तावेज बनाने को स्पष्ट नहीं करते हैं। मुझे लगता है कि एक डॉक्टर पैच फायदेमंद होगा।

+1

बिंगो! इसे 'उपयोग पुनः' डीबग 'के साथ चलाना इसे पुष्टि करता है। – innaM

1

यदि रेगेक्स में कोई इंटरपोलेटेड तार होता है, तो यह हमेशा संकलित होता है (शायद यदि आप/o स्विच का उपयोग नहीं करते हैं - मैं स्वीकार करता हूं/मुझे हमेशा भ्रमित करता है)। अगर रेगेक्स में केवल शाब्दिक पाठ है, तो मेरा मानना ​​है कि आदम का जवाब सही है।

यह IIRC इस परिदृश्य को संभालने के लिए होती है:

while (my $foo = $something->next) { 
    my $regex1 = qr/ab(cd+)ef?/; # only compiled once 
    my $regex2 = qr/ab${foo}*ef/; # compiled every time through the loop 
    # do stuff with $regex1 and $regex2 
} 
+1

यदि इसका मतलब है तो इसका अर्थ बहुत बुरी तरह से किया जाता है। –

2

संपादित करें: यह जवाब गलत है (या कम से कम गुमराह), लेकिन वहाँ टिप्पणी है कि संरक्षण के लायक है में कुछ दिलचस्प चर्चा है। John Siracusa's answer सही ट्रैक पर प्रतीत होता है।


qr// के लिए दस्तावेज़ कहा गया है कि

STRING एम/पैटर्न में पैटर्न/के रूप में एक ही तरह से अंतर्वेशित है।

जो संभावित रूप से नियमित अभिव्यक्तियों को पुन: संकलित करने का व्यवहार शामिल नहीं करता है जिसके लिए पैटर्न नहीं बदला गया है, या इंटरपोलेटेड चर शामिल नहीं होने के मामले में नहीं बदला जा सकता है।

foreach my $char ('a' .. 'z') { 
    my $vowel = qr/[aeiou]/; 
    say "$char is a vowel" if $char =~ $vowel; 
} 
+0

मुझे उद्धृत अनुभाग के साथ क्या करना है? तथ्य यह है कि पर्ल संकलन को कैश कर रहा है इसका मतलब यह नहीं है कि '$ स्वर' को 'STRING' का उद्धृत और संकलित संस्करण नहीं दिया जाएगा। जिस वाक्यांश के बारे में मैं पूछ रहा हूं, ऐसा लगता है कि 'qr/STRING/'के लिए उद्धृत किया गया है, लेकिन संकलित नहीं किया गया है,' STRING' का संस्करण। मैं पूछ रहा हूं कि वर्तमान में या अतीत में कोई मामला है जहां 'qr/STRING /' संकलित रेगेक्स वापस नहीं करता है। यदि ऐसा कोई मामला नहीं है जहां यह करता है, तो मुझे शायद उस कथन को स्पष्ट करने के लिए एक पैच सबमिट करना चाहिए। –

+0

क्यूआर ऑपरेटर हर बार जब इसका सामना करना पड़ता है तो इसकी सामग्री को रेगेक्स में संकलित करता है। (यह ए/ओ संशोधक की उपस्थिति के बावजूद यह करता है।) लूप के ऊपर $ vowel = qr/[aeiou]/line hoisting लगभग आपके सिस्टम पर उदाहरण की निष्पादन गति को दोगुना कर देता है। –

+1

@ जॉन सिराकुसा हालांकि कैश प्रतीत होता है, इस कोड की जांच करें: http://gist.github.com/247337 यदि यह हर बार फिर से संकलित होता है, तो 'diff' और' same' का रनटाइम वही होगा, लेकिन 'वही 'लगभग तीन गुना तेज है। मुझे लगता है कि आप जो समय अंतर देख रहे हैं वह वह है जो '$ vowel' चर बनाने के लिए होता है और इसे कैश किए गए, संकलित रेगेक्स को असाइन करता है। –

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