2013-07-04 138 views
-5

我有一個:

my ($pid) = ($_ =~ m/^.*\.(\d+)$/); 

是什麼$ PID比賽嗎?

回答

5

這裏你不是匹配$pid,而是$_到正則表達式 - m/^.*\.(\d+)$/$pid將存儲匹配$_與正則表達式模式的結果。

這裏的正則表達式的解釋:

m/  # Delimiter 
^ # Match beginning of string 
    .* # Match 0 or more repetition of any character except a newline 
    \. # Match a dot (.) 
    ( # Start a capture group 
    \d+ # Match 1 or more repetition of digits. 
    )  # Close capture group 
    $  # Match end of string 
/  

所以,如果在$_值上面的圖案相匹配,$pid將包含在第一捕獲組捕獲的價值,因爲你已經得到周圍$pid一個括號,所以你的匹配操作將在列表上下文中評估。

你的匹配是有效的一樣:

# Note you can remove the `m`, if you use `/` as delimiter. 
my ($pid) = /^.*\.(\d+)$/ 

還有一點要注意的是,因爲你正在做什麼用的開頭匹配的文本,你並不真的需要與之相匹配的。因此,您可以刪除.*,但在這種情況下,您必須從中刪除插入符號(^)。所以,你現在正則表達式可以替換爲:

my $(pid) = /\.(\d+)$/ 
+0

事實上,'$ pid'將包含第一個捕獲組,因爲周圍的'$ pid'的括號使這個名單分配,所以'=〜'在列表上下文中進行評估。 –

+0

@llmari。哎呀。錯過了。 –

+0

要選擇更多的尼特,上面的「句子」應該是「字符串」,並且'.'將匹配任何字符_except_換行符(因爲不使用'/ s'開關)。雖然這可能是一個錯誤。假設它是這樣的,整個事情可以寫得更緊湊,就像我的($ pid)=($ _ =〜/ \。(\ d +)$ /);',甚至只是'my($ pid)=/\(\ d +)$ /;'。此外,'$'也可以匹配字符串末尾換行符之前的位置。 –