我对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专业人士来说这很容易,它让我感到困惑!
提前致谢。
答案 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
表示忽略大小写,因此from
或SUBJECT
就可以了。
and
表示如果匹配则继续评估(即执行)表达式。如果没有匹配,则忽略and
后面的任何内容。
表达式的其余部分打印标题行($_
)和换行符("\n"
)。
在perl中,and
和or
是布尔运算符。它们是&&
和||
的同义词,除了它们的优先级低得多,因此可以更容易地编写短路表达式而不会出现大量括号中的混乱。
将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