Perl,从正则表达式匹配赋值给变量

时间:2013-02-05 19:44:03

标签: regex perl syntax variable-assignment parentheses

我对perl相对较新,check_ilo2_health.pl中有一段代码示例,其中有一段语法,我不明白它是如何工作的或原因。代码片段是逐行解析SSL客户端数据,在本例中是XML。

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 行。我知道 my($ msg)将变量视为一种列表,我理解正则表达式是如何匹配的;但是,我不明白的是语法, $ msg 分配无错误。 perl似乎正在使用括号语法,这样才能实现。虽然它有效但我想知道它是如何工作的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:10)

请参阅Perlretut, Extracting-matches

  

...在标量上下文中,$time =~ /(\d\d):(\d\d):(\d\d)/返回true或false值。但是,在列表上下文中,它返回匹配值($1,$2,$3)

的列表

所以,在

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

( $line =~ m/MESSAGE='(.*)'/)返回捕获组的匹配列表。您有一个捕获组,因此其内容将存储在($ msg)。