3

Mail::POP3Client中有一个示例片段,其中有一段我不明白它为什么或如何工作的语法:

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

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

4

1 回答 1

4

这实际上非常棘手。它所做的是利用 perl 的短路特性来做一个条件语句。这和说这个是一样的。

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

它之所以有效,是因为 perl 在某些事物评估为 0 后停止评估和声明。除非另有指定,否则表单中的正则表达式/regex/而不是$somevar =~ /regex/将正则表达式应用于默认变量,$_

你可以像这样存储它

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

或者您可以使用捕获组

/^((?:From|Subject):\s+)/i

它将整个东西存储到$1

于 2012-08-01T17:27:12.003 回答