2012-10-29 27 views
13

दो मुद्रित संख्याएं अलग क्यों हैं?खाली स्ट्रिंग के साथ प्रतिस्थापन: अप्रत्याशित परिणाम

#!/usr/bin/env perl 
use warnings; 
use 5.10.1; 

my $sep = ''; 
my $number = 110110110110111; 

$number =~ s/(\d)(?=(?:\d{3})+\b)/$1$sep/g; 
say "A: <$number>"; 

$number =~ s/\Q$sep\E//g; 
say "B: <$number>"; 

आउटपुट:

A: <110110110110111> 
B: <11111111111> 

उत्तर

15

उद्धरण man perlop:

पैटर्न रिक्त स्ट्रिंग पर मूल्यांकन करता है, तो पिछली बार सफलतापूर्वक निष्पादित नियमित अभिव्यक्ति के बजाय प्रयोग किया जाता है।

प्रयास करें देखने के लिए क्या हो रहा है दूसरा प्रतिस्थापन से पहले एक सफल regex मैच सम्मिलित करने के लिए:

(my $foo = '1') =~ s/1/x/; # successfully match “1” 
$number =~ s///g;   # now you’re deleting all 1s 
say "B: <$number>";  # <0000> 

मैं कहता हूँ कि हम इस पदावनत किया जाना चाहिए और use warnings द्वारा बारे में चेतावनी दी है, यह लाभ देखना मुश्किल है ।

+7

ध्यान दें कि इससे पता चलता है कि \ Q \ E और इंटरपोलेशन स्ट्रिंग ऑपरेशंस हैं, रेगेक्स उचित का हिस्सा नहीं है, क्योंकि वे सभी "रिक्त स्ट्रिंग के पैटर्न का मूल्यांकन" परीक्षण से पहले हल किए जाते हैं। यदि आप वास्तव में इस गलतफहमी को रोकना चाहते हैं और आपके रेगेक्स में केवल इंटरपोलेटेड बिट्स शामिल हैं जो सभी खाली हो सकते हैं, तो '(? #)' में फेंक दें जिसका मिलान करने पर कोई प्रभाव नहीं पड़ता है लेकिन पैटर्न को खाली नहीं करता है। – ysth