2013-02-05 20 views
5

से वैरिएबल को असाइन करें मैं पेर्ल के लिए अपेक्षाकृत नया हूं और check_ilo2_health.pl में कोड का एक उदाहरण स्निपेट है जिसमें सिंटैक्स का एक टुकड़ा है जिसे मैं समझ नहीं पा रहा हूं कि यह कैसे काम करता है या क्यों। कोड स्निपेट SSL क्लाइंट डेटा को पार्स कर रहा है, इस मामले में एक्सएमएल, रेखा से लाइन।पर्ल, रेगेक्स मैच

if ($line =~ m/MESSAGE='/) { 
    my ($msg) = ($line =~ m/MESSAGE='(.*)'/); #<---- HERE 

    if ($msg !~ m/No error/) { 
     if ($msg =~ m/Syntax error/) { #...etc 

प्रश्न में एक्सएमएल का एक उदाहरण:

<RESPONSE 
    STATUS="0x0000" 
    MESSAGE='No error' 
/> 

तो इस मामले में अगर बयान एक्सएमएल नमूना की संदेश लाइन ले जाता है। मैं समझता हूं कि मेरा ($ msg) वैरिएबल को एक प्रकार की सूची के रूप में मानता है और मैं समझता हूं कि नियमित अभिव्यक्ति कैसे मेल खाते हैं; हालांकि, मुझे समझ में नहीं आता है कि $ msg से कोई त्रुटि नहीं है। लगता है कि पर्ल कंटैक्स सिंटैक्स के साथ खेल रहा है और इस तरह काम करने के लिए। हालांकि यह काम करता है मैं जानना चाहता हूं कि यह कैसे काम करता है। किसी भी तरह की सहायता की सराहना की जाएगी।

+0

आप '= ~' या '! ~', उन रहे हैं [बाध्यकारी ऑपरेटरों] की बात कर रहे हैं (http://perldoc.perl.org/perlop.html#Binding-Operators)। –

उत्तर

10

Perlretut, Extracting-matches देखें:

... अदिश संदर्भ में, $time =~ /(\d\d):(\d\d):(\d\d)/ एक सही या गलत मान देता है। सूची संदर्भ में, तथापि, यह मिलान किया मूल्यों ($1,$2,$3)

तो की सूची देता है,

($msg) = ($line =~ m/MESSAGE='(.*)'/); 

($line =~ m/MESSAGE='(.*)'/) में कब्जा समूहों द्वारा मिलान की सूची देता है। आप एक कैप्चरिंग समूह है, ताकि की सामग्री तो ($ msg) में संग्रहित है।

+0

बिल्कुल सही, धन्यवाद! यह समझ में आता है। जब आप अपने स्रोत के लिए एक लिंक प्रदान करते हैं तो मैं आपके उत्तर को उखाड़ फेंक दूंगा लेकिन मेरे पास अभी भी 15 से कम प्रतिष्ठा है। ओह अच्छा। +1 – Burns

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