[英]Perl String Regular Expression - Need Explanation
我對Perl很陌生。 我有下面的代碼片段可以正常工作,但我不完全理解:
for ($i = 1; $i <= $pop->Count(); $i++) {
foreach ( $pop->Head( $i ) ) {
/^(From|Subject):\s+/i and print $_, "\n";
}
}
$ pop-> Head是由Mail :: POP3Client函數返回的字符串或字符串數組,它是一堆電子郵件的標題。 第3行是某種正則表達式,它從標頭中提取FROM和SUBJECT。
我的問題是,打印功能如何僅打印“發件人”和“主題”而標題中沒有其他所有內容? “和”是什么意思-這肯定不是布爾值,可以嗎? 最重要的是,我想將From字符串放入其自己的變量(我的$ fromline)中。 我該怎么做呢?
我希望這對某些Perl專業人士來說很容易,這讓我感到困惑!
提前致謝。
ARGHHH ...我輸入答案時問題已被編輯。 好吧,把我的答案中不再相關的部分扔掉,集中在具體的問題上:
外循環遍歷郵箱中的所有郵件。
內部循環未指定循環變量,因此使用特殊變量$_
。
在通過內部循環的每次迭代中, $_
是消息號$i
頭行。
/^(From|Subject):\s+/i and print $_, "\n";
該行的第一部分,直到and
是一個模式。 我們沒有指定處理模式的方式,因此它與$_
隱式匹配。 (這是使$_
變得特別的原因之一。)這使我們進行了是/否測試:該模式是否與標題行匹配?
模式將測試該項目是否以( <
)單詞“ From”或“ Subject”開頭,然后緊跟冒號和一個或多個空格字符。 。(這不是正確的模式來匹配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的口頭禪:“有多種方法可以做到這一點。” 在將余額存儲在$fromline
之前,我已經從行的開頭刪除了“ From:”,但是我不知道您的需求。
這是合乎邏輯的, and
存在短路。 如果左側的結果為true(例如,如果該正則表達式匹配),則其右側的結果為print
。
如果左側的表達式為false,則不需要評估右側,因為最終結果仍為false,因此將其跳過。
另請參閱: perldoc perlop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.