Perl,将正则表达式匹配赋予标量

时间:2012-08-01 17:23:02

标签: regex perl

Mail::POP3Client中有一个示例代码段,其中包含一段语法,我不明白为什么或如何工作:

foreach ( $pop->Head( $i ) ) {
    /^(From|Subject):\s+/i and print $_, "\n";
}

特别是正则表达式。 $_在该行之后保持不变,但仅打印匹配。 另一个问题;我如何将该正则表达式的匹配分配给我自己的标量,以便我可以使用它而不是仅仅打印它?

1 个答案:

答案 0 :(得分:4)

这实际上非常棘手。它正在做的是利用perl的短路功能来制作条件语句。这跟说这个一样。

if (/^(From|Subject):\s+/i) { 
    print $_;
}

它起作用是因为perl在评估为0之后停止计算和语句。除非另有说明,/regex/而不是$somevar =~ /regex/形式的正则表达式将正则表达式应用于默认变量{{1 }}

你可以像这样存储它

$_

或者您可以使用捕获组

my $var;    
if (/^(From|Subject):\s+/i) { 
        $var = $_;
}

将整件事存入/^((?:From|Subject):\s+)/i