perl

2011-08-06 13 views
8

में वैश्विक ध्वज को समझने में सहायता करें जहां तक ​​मुझे लगता है कि वैश्विक वैश्विक/जी 'ध्वज में मुझे पता है कि खोज स्ट्रिंग में सभी मैचों को प्रतिस्थापित/वापस कर देगी। लेकिन मैं जिस तरह से यह वैश्विक चर के प्रति प्रतिक्रिया करता है, जबकि मिलान को समझने में सक्षम नहीं कर रहा हूँ किसी को समझा सकता है क्यों कि इन दो नमूना कार्यक्रमों के उत्पादन के बीच अंतर है:perl

संस्करण 1:

my $text = 'This is sample float value 3.2 '; 

getFloat(); 
getFloat(); 

sub getFloat(){ 
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/is){ 
     print "matched> $1$2$3 "; 
    } 
} 

आउटपुट: मिलान किया> 3.2 मिलान किया> 3,2

संस्करण 2: (वैश्विक ध्वज के साथ)

my $text = 'This is sample float value 3.2 '; 

getFloat(); 
getFloat(); 

sub getFloat(){ 
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/gis){ 
     print "matched> $1$2$3 "; 
    } 
} 

आउटपुट: मिलान किया> 3,2

, आउटपुट से देखा के रूप में वैश्विक झंडा मिलान के साथ केवल एक बार होता है। क्या कोई इस व्यवहार को समझा सकता है।

+0

आपको [perldoc perlretut] (http://perldoc.perl.org/perlretut.html#Using-regular-expressions- इन-पर्ल) – TLP

+0

आप क्या उम्मीद कर रहे हैं? आप इसे तब तक मिलान करना चाहते हैं जब तक यह मेल नहीं खाता? इसका मतलब यह नहीं होगा कि 'अगर' स्थिति हमेशा झूठी होगी। संक्षेप में, 'अगर (/.../ जी)' कोई मतलब नहीं है। – ikegami

उत्तर

10

g संशोधक के साथ, स्ट्रिंग अपने अंतिम मैच की जगह याद करती है, ताकि आप थोड़ी देर में g के साथ एक मैच का अनुरोध कर सकें और सभी मैचों को ढूंढ सकें।

g के बिना आप हर बार शुरू करते हैं और हमेशा पहला मैच पाते हैं।

आपके मामले में, g के साथ, आप पहली बार 3.2 से मेल खाते थे, लेकिन दूसरी बार जब आप मिलान करने का प्रयास करते थे, तो कोई और मैच नहीं था।

g के बिना आप getFloat() को एक अरब बार कॉल कर सकते हैं और आपको हमेशा पहला मैच मिल जाएगा।

+0

प्वाइंट उत्तर रे के लिए धन्यवाद –

8

जब किसी सूची संदर्भ में उपयोग किया जाता है, तो /g सभी मैचों को वापस करने के लिए =~ का कारण बनता है। जब स्केलर संदर्भ में उपयोग किया जाता है, /g प्रत्येक बार उपयोग किए जाने पर एक मैच लौटने के लिए =~ का कारण बनता है, और फिर स्ट्रिंग की शुरुआत में फिर से शुरू होने से पहले, कोई और मैच नहीं होने पर विफल रहता है (वापस लौटाता है)। (आप /gc का उपयोग करके इसे रोक सकते हैं।) आप मैच शुरू करने के लिए स्थिति को ढूंढने या सेट करने के लिए pos($text) फ़ंक्शन का भी उपयोग कर सकते हैं।

/g के बिना, =~ हर बार एक ही मैच देता है। यह pos($text) को undef पर सेट करने के बराबर है। (एक सूची संदर्भ में, =~ इसके बजाय कैप्चर की एक सूची देता है।)