簡體   English   中英

Perl字符串正則表達式-需要說明

[英]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表示忽略大小寫,因此fromSUBJECT都可以。

and表示如果存在匹配項,則繼續評估(即執行)該表達式。 如果沒有比賽,后面的任何內容and被忽略。

表達式的其余部分將打印標題行( $_ )和換行符( "\\n" )。

在perl中, andor是布爾運算符。 它們是&&||同義詞 ,但它們的優先級要低得多,這使得編寫簡短提示表達式更容易,而不會引起很多括號的混亂。

將“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM