2013-02-05 14 views
5

Ich bin relativ neu in Perl und es gibt ein Beispiel Code-Schnipsel in check_ilo2_health.pl, in dem es eine Syntax gibt, die ich nicht verstehe, wie oder warum es funktioniert. Das Code-Snippet analysiert SSL-Client-Daten, in diesem Fall XML, Zeile für Zeile.Perl, Zu Variable von Regex zuordnen

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

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

Ein Beispiel für die XML in Frage:

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

Also in diesem Fall die wenn Anweisung nimmt die MESSAGE Zeile der XML-Probe. Ich verstehe, dass meine ($ msg) behandelt die Variable als eine Art Liste und ich verstehe, wie die regulären Ausdrücke übereinstimmen; Was ich jedoch nicht verstehe, ist die Syntax, die $ msg zu ist. Die Perl scheint mit der Klammern-Syntax herumzuspielen und damit dies funktioniert. Während es funktioniert, würde ich gerne wissen, wie es funktioniert. Jede Hilfe wäre willkommen.

+0

Wenn Sie sich auf die '= ~' oder '! ~' Beziehen, sind dies [Bindeoperatoren] (http://perldoc.perl.org/perlop.html#Binding-Operators). –

Antwort

10

Siehe Perlretut, Extracting-matches:

... in Skalarkontext, $time =~ /(\d\d):(\d\d):(\d\d)/ gibt einen Wert true oder false. Im Listenkontext gibt es jedoch die Liste der angepassten Werte ($1,$2,$3)

Also, in

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

($line =~ m/MESSAGE='(.*)'/) gibt eine Liste der Spiele durch die Erfassung von Gruppen. Sie haben eine Erfassungsgruppe, daher wird der Inhalt davon in ($ msg) gespeichert.

+0

Perfekt, danke! Das macht Sinn. Ich würde deine Antwort verbessern, da du einen Link zu deiner Quelle angegeben hast, aber ich habe immer noch weniger als 15 Reputation. Naja. +1 – Burns