Perl String正则表达式 - 需要解释

时间:2015-01-12 05:32:41

标签: regex perl

我对Perl很新。我有以下代码片段可以正常工作,但我不完全理解它:

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

$ pop-&gt; Head是函数Mail :: POP3Client返回的字符串或字符串数​​组,它是一堆电子邮件的标题。第3行是某种正则表达式,它从标题中提取FROM和SUBJECT。

我的问题是打印功能如何只打印From和Subject而没有标题中的所有其他内容?什么&#34;和&#34;意思是 - 这肯定不是布尔值,可以吗?最重要的是,我想将From字符串放入自己的变量(我的$ fromline)。我该怎么做?

我希望对于一些Perl专业人士来说这很容易,它让我感到困惑!

提前致谢。

2 个答案:

答案 0 :(得分:4)

ARGHHH ...我在输入答案时编辑了这个问题。好的,把我的答案的一部分丢掉,不再重要,并专注于具体的问题:

外部循环遍历邮箱中的所有邮件 内循环不指定循环变量,因此使用特殊变量$_ 在内循环的每次迭代中,$_是来自消息号$i的一个标题行。

/^(From|Subject):\s+/i and print $_, "\n";

此行的第一部分,直到and是一种模式。我们没有说明如何处理模式,因此它与$_隐式匹配。 (这是使$_特殊的事情之一。)这给了我们一个是/否测试:模式是否匹配标题行?

该模式测试该项目是否以(<)单词&#34; From&#34;或&#34;主题&#34;,紧接着是一个冒号和一个或多个空白字符。 (这不是与RFC 822标头匹配的正确模式。空格在冒号的两个侧是可选。模式应更恰当地为/^(From|Subject)\s*:\s*/i。但是这是一个单独的问题。)模式末尾的i表示忽略大小写,因此fromSUBJECT就可以了。

and表示如果匹配则继续评估(即执行)表达式。如果没有匹配,则忽略and后面的任何内容。

表达式的其余部分打印标题行($_)和换行符("\n")。

在perl中,andor是布尔运算符。它们是&&||的同义词,除了它们的优先级低得多,因此可以更容易地编写短路表达式而不会出现大量括号中的混乱。

将From行捕获到单独变量的最小更改是将以下行添加到内部循环中:

/^From\s*:\s*(.*)$/i and $fromline = $1;

您可能也应该放

$fromline = undef
在循环之前

,这样你就可以在循环之后测试是否有一个From:行。

还有其他方法可以做到这一点。事实上,这是perl的口头禅之一:&#34;有不止一种方法可以做到这一点。&#34;我已经删除了&#34; From:&#34;在将余额存入$fromline之前,从行的开头开始,但我不了解您的需求。

答案 1 :(得分:0)

这是一个短路的逻辑and。如果左侧评估为true - 例如,如果该正则表达式匹配 - 它将评估右侧,print

如果左边的表达式为false,则不需要评估右侧,因为最终结果仍为false,因此它会跳过它。

另请参阅:perldoc perlop