$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