2012-08-01 10 views
3

有在Mail::POP3Client一个例子片断在那里有一块语法的,我不明白为什么,或者它是如何工作的:Perl中,正则表达式指定匹配标

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

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

+1

'$ _''变量隐含和设置或使用在Perl的很多地方。那里的'foreach'循环指定了弹出的行,因为没有指定的变量被赋值。不使用'=〜'的匹配类似地匹配'$ _',裸体'print'或'say'会输出'$ _'。该行可以写成'/ ^(From | Subject):\ s +/i并且说;'并且具有完全相同的效果。你可以像对待其他变量一样对待它。 – zostay 2012-08-01 17:31:31

回答

4

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

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

它的工作原理因为Perl停止评估和报告评估的东西为0后,除非另有规定形式的/regex/代替$somevar =~ /regex/ regex将正则表达式应用到默认的变量,$_

可以它存储这样

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

,或者你可以使用一个捕获组

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

这将存储整个东西到$1