2014-01-17 36 views
0

我有一個關於匹配多個組的正則表達式的處理/返回數據類型的問題。 考慮這條線:返回數據類型的Perl正則表達式匹配組

($pre, $middle, $post) = $text =~ /(.*)Telefon:(.+)(Fax:.*)/; 

它指定$文字,$匹配部分的預值,$中,$發佈爲列表,我想! 所以我想檢查之前返回匹配的數量。由於返回的數據類型是一個列表,我假設了以下工作:

if (scalar ($text =~ /(.*)Telefon:(.+)(Fax:.*)/) == 3) { do something } 

這個問題似乎是

(scalar ($text =~ /(.*)Telefon:(.+)(Fax:.*)/) 

回報1雖然如預期以下工作(返回值3):

my @arr = $text =~ /(.*)Telefon:(.+)(Fax:.*)/; 
scalar @arr 

似乎有一些Perl的神奇事情。我能做些什麼來獲得期望值而不需要在兩者之間分配一個值(@arr)?

回答

1

我們必須爲比賽提供列表上下文 - 例如,通過分配到一個列表:

() = $text =~ /.../ 

是的,空列表的作品。我們可以在標量上下文中使用這個列表分配,例如,

3 == (() = $text =~ /.../) 

您可以將()=想象爲「僞算子的計數」。

許多Perl運算符和內置運算符的行爲因上下文而異。如果有疑問,請閱讀documentation(儘管此特定部分將您引用到文檔的其他部分)。

4

在perl中,與列表上下文相比,函數或運算符可以在標量上下文中返回不同的東西。事實上,即使你寫自己的潛艇可以做到這一點。請參閱wantarray關鍵字。

當在標量上下文中評估正則表達式時,它返回1表示匹配或0表示不匹配。不同於它在列表上下文中返回的內容,即捕獲組。

當您首先分配給數組時,將在列表上下文中評估正則表達式。然後你得到數組的標量值,這給出了長度。

無論如何我懷疑你不會得到你想要的結果。如果正則表達式匹配,即使某些捕獲組爲空,您也將始終獲得大小爲3的列表。但是,如果任何捕獲組爲空,則列表中的結果槽將爲undef(您可以檢查)。如果正則表達式不匹配,則返回空列表。