2012-08-01 28 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