2013-02-05 8 views
5

私は比較的新しいperlであり、コードの例がcheck_ilo2_health.plにありますが、その仕組みがわからない構文があります。コードスニペットは、SSLクライアントデータ(この場合はXML)を1行ずつ解析しています。Perl、正規表現から変数に代入する

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

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

問題のXMLの例:

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

だから、この場合に if文は、XMLサンプルのMESSAGEラインを取ります。私は私の($ msg)は、並べ替えのリストとして変数を扱うことを理解し、私は正規表現の一致方法を理解しています。しかし、私が理解できないのは、$ msgであり、からに割り当てられていないという構文です。エラーはありませんです。 perlは、括弧の構文などでこれを動作させるように見えます。それが動作している間、私はそれがどのように動作するか知りたいです。いかなる援助も感謝します。

+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='(.*)'/)に捕捉基によってマッチのリストを返します。 1つのキャプチャグループがあるので、その内容が($ msg)に格納されます。

+0

完璧、ありがとう!意味あり。私はあなたのソースへのリンクを提供して以来あなたの答えをupvoteだろうが、私はまだ15未満の評判を持っています。しかたがない。 +1 – Burns