该程序
say "zipi zape" ~~ /(\w)\w» \s+ \w+({$0})/;
返回
「pi zape」
0 => 「p」
1 => 「」
我将哪一个解释为对匹配零宽度匹配的第一个匹配的反向引用?也许是因为它与$ 0相匹配,而$ 0在正则表达式之外被逐项列出了?如何使用这些反向引用并同时捕获匹配? 注意:这与this documentation issue有关,需要澄清使用反向引用的情况。
答案 0 :(得分:4)
根据https://support.google.com/datastudio/answer/7088031:
如果您需要从另一个捕获中引用一个捕获,请先将其存储在变量中
因此您可以使用:
say "zipi zape" ~~ /(\w){} :my $c = $0; \w » \s+ \w+($c)/;
输出:
「pi zap」
0 => 「p」
1 => 「p」
答案 1 :(得分:3)
{$0}
不是反向引用。
这是一个代码块。
在这种情况下,它是一个绝对不执行任何操作的代码块。
要使其真正用作正则表达式的一部分,它需要<>
围绕它。
实际上,由于()
表示类似于$/
的新闭包,因此如果它实际上用于某件事,则它将是一个空正则表达式。
($/
每重置一次()
,因此$0
也重置。)
say "zipi zape" ~~ /(\w)\w» \s+ \w+(<{$0}>)/;
Cannot resolve caller INTERPOLATE_ASSERTION(Match:D: Nil:U, BOOTInt, BOOTInt, BOOTInt, BOOTInt, PseudoStash:D); none of these signatures match:
(Match: Associative:D, $, $, $, $, $, *%_)
(Match: Iterable:D \var, int \im, int \monkey, int \s, $, \context, *%_)
(Match: Mu:D \var, int \im, int \monkey, $, $, \context, *%_)
in block <unit> at <unknown file> line 1
之所以会这样,是因为它与(<{Nil}>)
基本相同。
您可以做的是使用$/
在第二个()
之前更新{}
,并在$0
周围使用双引号
say "zipi zape" ~~ /(\w){}\w» \s+ \w+("$0")/;
「pi zap」
0 => 「p」
1 => 「p」
对我来说,这似乎有点不可靠。
(这取决于我认为是错误功能,即使不是彻底的错误。)
这是我们获取HåkonHægland将其存储在词汇变量中的答案。
(在使用$/
更新{}
之后。)
say "zipi zape" ~~ /(\w){} :my $c = $0; \w » \s+ \w+($c)/;
词法变量的作用域不限于()
,因此这样做是绝对安全的。
我会亲自对$0
进行字符串化,因为那是$0
内部正在使用的匹配对象的唯一部分。
say "zipi zape" ~~ /(\w){} :my $c = ~$0; \w » \s+ \w+($c)/;
老实说,我什至没有理由赢得第二场比赛,因为它总是与第一场比赛相同。
say "zipi zape" ~~ /(\w)\w» \s+ \w+$0/;
添加»
也没什么意义,因为\s+
已经迫使它成为单词的结尾。
say "zipi zape" ~~ /(\w)\w \s+ \w+$0/;