Perl中捕获括号和后引用的括号之间的区别

时间:2016-01-25 21:58:38

标签: perl

我刚刚开始学习Perl,我想知道Perl中捕获和返回引用的括号之间的区别,以及每个更有用的情况?

当我说括号用于捕捉时,我指的是以下内容:

if ($email =~ /([^@]+)@(.+)/) {
    print "Username is $1\n";
    print "Hostname is $2\n";
}

当我说回引用时,我引用的内容如下:

# (.)\1
# (.) = capture group; \1 = reference group
# (.)(.)\2\1; This pattern has 2 capture groups
# (.)(.)\g{2}\g{1}; This pattern is safer. Can't be confused w/ digits

如果我的语法不正确w \ back backference,请告诉我,因为我不能100%确定语法如何用于反向引用。

3 个答案:

答案 0 :(得分:4)

如果整个模式匹配,括号中的正则表达式模式的一部分将被捕获。如何使用捕获的子字符串无关紧要。捕获从左到右开始编号,其开头括号出现在正则表达式中

  • 稍后可以通过使用序列\1等或(最好)\g1等将其用作反向引用

  • 在替换的替换部分或后续的Perl代码

    <中,可以在模式外使用 模式作为简单的字符串值$1等。 / LI>

您可以同时以两种方式使用捕获的字符串,例如

say $1 if $str =~ /(.)\g1/;

请注意,如果模式无法匹配,$1的值将与最近的成功匹配不变,因此$1等的任何使用都应该是条件是成功匹配从中获取的模式

答案 1 :(得分:2)

没有区别。括号捕获(除非它是(?...)构造之一)。您可以将捕获的文本用作反向引用或使用捕获变量($1)(或两者)。

答案 2 :(得分:1)

没有区别。甚至没有两件事比较两件。只有(...)

它可以用于反向引用。 \1是一个正则表达式原子,与第一次捕获的捕获相匹配。这只能用于正则表达式模式。

它可以用来捕捉。 $1是一个Perl变量,包含捕获的第一个捕获内容。这只能在Perl代码中使用。