我刚刚开始学习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%确定语法如何用于反向引用。
答案 0 :(得分:4)
如果整个模式匹配,括号中的正则表达式模式的一部分将被捕获。如何使用捕获的子字符串无关紧要。捕获从左到右开始编号,其开头括号出现在正则表达式中
稍后可以通过使用序列\1
等或(最好)\g1
等将其用作反向引用。
在替换的替换部分或后续的Perl代码
<中,可以在模式外使用 模式作为简单的字符串值$1
等。 / LI>
您可以同时以两种方式使用捕获的字符串,例如
say $1 if $str =~ /(.)\g1/;
请注意,如果模式无法匹配,$1
的值将与最近的成功匹配不变,因此$1
等的任何使用都应该是条件是成功匹配从中获取的模式
答案 1 :(得分:2)
没有区别。括号捕获(除非它是(?...)
构造之一)。您可以将捕获的文本用作反向引用或使用捕获变量($1
)(或两者)。
答案 2 :(得分:1)
没有区别。甚至没有两件事比较两件。只有(...)
。
它可以用于反向引用。 \1
是一个正则表达式原子,与第一次捕获的捕获相匹配。这只能用于正则表达式模式。
它可以用来捕捉。 $1
是一个Perl变量,包含捕获的第一个捕获内容。这只能在Perl代码中使用。