$1
和$2
是匹配的變量。它們指的是在最後一個正則表達式的各個括號匹配組中匹配的內容。
$1
具有在第一個括號組中匹配的字符串部分。 $2
具有在第二個括號組中匹配的字符串部分。你可以猜到$3
將包含什麼。
讓我們看看你的例子:
$data = "What is the STATUS of your mind right now?";
$data =~/.*/; print "$1,$2\n";
這裏沒有括號,那麼1 $ 2和$不包含任何東西。
$data =~/(.*?)(u+).*/; print "$1, $2\n";
這裏有兩個括號組。第一個是(.*?)
,它不匹配任何東西或任何可以匹配的東西(以非貪婪的方式,但這是另一個話題)。第二個是(u+)
,它匹配一個或多個*「u」* s。
第一個(也是唯一一個)的「u」 $data
是在中間的「你」,所以$1
匹配萬萬直到第一「U」和$2
匹配一個「U」 。
$data =~/(.?)(u+).*/; print "$1, $2\n";
現在第一組是(.?)
,它匹配一個單個字符,或者什麼都不匹配。然後(u+)
再次匹配一個或多個*「u」* s。
由於只是一個「U」在我們的字符串,第一組會收到一個單個字符,這是「O」,第二組將與實際「U」
$data =~/(\w+\s)+/; print "$1, $2\n";
最後,第一組匹配(\w+\s)+
,其是一個或多個「字」字符,隨後是空白字符。 「字」字符是任何字母數字字符或下劃線。沒有第二組,但有+
(一個或多個)符號。
那麼它匹配了什麼?這是一個奇怪的,我不確定我的理解是否100%準確。由於整個匹配組有+
,它會吞噬儘可能多的字符串,並仍然匹配\w+\s
。在這種情況下,它可以不顧一切,直到「右」,它然後作爲$1
匹配。
然後,因爲它具有+
,它會尋找任何更多的比賽隨即,但自從「正確」是匹配的,它永遠不會找到另一個小組賽中最右邊的字符串。
所以$1
是 「正確的」,並$2
是空的。
摘要:
當你看到了$ 1,$ 2,你應該尋找在最後的正則表達式匹配的組括號。
OK但是,什麼是$ 1和$ 2? – TCM 2010-10-02 17:39:12
@Nitesh:該問題在鏈接到的文檔的[提取匹配項](http://perldoc.perl.org/perlretut.html#Extracting-matches)部分中得到解答。 – Ether 2010-10-02 17:50:04
@Nitesh:他們被稱爲反向引用。你有沒有讀過鏈接? – BoltClock 2010-10-02 17:50:24