5

我对 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行。我了解我的 ($msg)将变量视为一种列表,并且我了解正则表达式如何匹配;但是,我不明白的是$ msg分配No error的语法。perl 似乎正在玩弄括号语法等以使其正常工作。虽然它有效,但我想知道它是如何工作的。任何援助将不胜感激。

4

1 回答 1

10

请参阅Perlretut,提取匹配

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

所以,在

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

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

于 2013-02-05T20:17:43.963 回答