以下代码有什么作用?

时间:2010-10-02 17:31:48

标签: perl

以下是做什么的?有人可以解释一下吗?

$data = "What is the STATUS of your mind right now?";

$data =~/.*/; print "$1,$2\n";

$data =~/(.*?)(u+).*/; print "$1, $2\n";

$data =~/(.?)(u+).*/; print "$1, $2\n";

$data =~/(\w+\s)+/; print "$1, $2\n";

什么是$1 and $2?这如何获得它的价值?什么是这些正则表达式?

提前致谢:)

2 个答案:

答案 0 :(得分:4)

请阅读perldoc perlretut,它将回答您的所有问题。

Perl正则表达式的一般参考是perldoc perlre,但您应首先阅读本教程,因为它可以作为更好的介绍。

答案 1 :(得分:0)

$1$2是匹配变量。它们指的是在最后一个正则表达式中匹配组的各个括号中匹配的内容。

$1包含第一个括号组中匹配的字符串部分。 $2包含 second 括号组中匹配的字符串部分。你可以猜出$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。

$data中的第一个(也是唯一的)“u”位于“you”的中间,因此$1会匹配到第一个“你“$2匹配那个”你“

$data =~/(.?)(u+).*/; print "$1, $2\n";

现在第一组是(.?),它匹配一个单个字符,或者什么也没有。然后(u+)再次匹配一个或多个*“u”* s。

由于我们的字符串中只有一个“u”,因此第一个组将是它之前的一个单个字符,即“o”,第二个组将匹配实际的“u”

$data =~/(\w+\s)+/; print "$1, $2\n";

最后,第一组匹配(\w+\s)+,这是一个或多个“单词”字符,后跟一个空白字符。 “Word”字符是任何字母数字字符或下划线。没有第二组,但有+(一个或多个)符号。

那么它与之相匹配的是什么?这是一个奇怪的,我不确定我的理解是否100%准确。由于整个匹配组都有+,因此它会尽可能多地吞噬字符串并仍然匹配\w+\s。在这种情况下,它可以忽略所有内容,直到“right”,然后匹配为$1

然后,因为它有+,它会在之后立即寻找更多匹配,但由于“right”是最右边的字符串匹配,它将永远找不到另一场小组赛。

因此$1为“正确”,$2为空。

<强>要点:

当你看到$ 1和$ 2时,你应该在最后一个正则表达式中查找匹配的组括号。