2017-04-01 9 views
6

perlre में/p संशोधक का कहना है:

पी

स्ट्रिंग इस तरह का मिलान नहीं हुआ बचाना कि $ {^ PREMATCH}, $ {^ मैच}, और $ {^ POSTMATCH} मिलान के बाद उपयोग के लिए उपलब्ध हैं।

पर्ल 5.20 और उच्चतर में इसे अनदेखा किया जाता है। एक नई कॉपी-ऑन-राइट तंत्र, $ {^ PREMATCH}, $ {^ MATCH}, और $ {^ POSTMATCH} संशोधक के बावजूद मैच के बाद उपलब्ध होगा।

भी perlvar

$ {^ मैच} यह $ & ($ मैच) सिवाय इसके कि यह प्रदर्शन उस चर के साथ जुड़े दंड देना नहीं है के समान है।

पर्ल v5.18 और इससे पहले, यह केवल मान वापस करने की गारंटी देता है जब पैटर्न संकलित या पी संशोधक के साथ निष्पादित किया गया था। पर्ल v5.20 में,/पी संशोधक कुछ भी नहीं करता है, इसलिए $ {^ MATCH} $ MATCH जैसा ही काम करता है।

परीक्षण:

echo 'Lorem ipsum dolor sit ut dicta qui dolores.' |\ 
perl -nE 'say ${^MATCH} while m/dolor/g' 

उत्पादन: दो खाली लाइनों (2x \n)

लेकिन:

echo 'Lorem ipsum dolor sit ut dicta qui dolores.' |\ 
perl -nE 'say ${^MATCH} while m/dolor/gp' 

उत्पादन:

dolor 
dolor 
,210

मेरे पर्ल:

$ perl -v 

This is perl 5, version 24, subversion 0 (v5.24.0) built for darwin-2level 
(with 1 registered patch, see perl -V for more detail) 

तो 5.24.0 में /p संशोधक अभी भी आवश्यक है? या मुझे क्या याद आया?

+0

मैं आपके मूल्यांकन के साथ सहमत हूं। वर्कअराउंड: आप '$ &' ('$ MATCH') का उपयोग कर सकते हैं। – ikegami

उत्तर

6

वास्तव में कोड के व्यवहार और दस्तावेजी व्यवहार के बीच एक विसंगति है। टिकट RT#131087 के रूप में एक बग रिपोर्ट दायर की।

एक कामकाज के रूप में, आप $& ($MATCH) का उपयोग कर सकते हैं।

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