如标题所示,$/
和之间有什么区别$¢
?它们似乎总是具有相同的值:
my $text = "Hello world";
$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;
两者都会导致Match对象具有相同的值。在一个之上使用一个之上的逻辑是什么?
如标题所示,$/
和之间有什么区别$¢
?它们似乎总是具有相同的值:
my $text = "Hello world";
$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;
两者都会导致Match对象具有相同的值。在一个之上使用一个之上的逻辑是什么?
Answers:
变量$/
引用最新的匹配项,而变量$¢
引用最新的最外部匹配项。在像上面这样的大多数基本正则表达式中,可能是相同的。但是从该.raku
方法的输出可以看出,Match
对象可以包含其他Match
对象(这是您在使用$<foo>
或$1
进行捕获时得到的)。
假设我们有以下带有正则表达式的正则表达式
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
如果我们匹配“ abcdcdcd”,然后运行它将看到以下输出:
0 2
0 4
0 6
但是,如果从使用更改$¢
为$/
,则会得到不同的结果:
2 2
4 4
6 6
(之所以.to
似乎有点偏离,是因为它和.pos
-直到捕获块结束才更新。)
换句话说,$¢
它将始终指向您的最终匹配对象(即$final = $text ~~ $regex
),因此您可以像完成完整匹配后一样,遍历regex内部的复杂捕获树,因此在上述示例中,您可以确实$¢[0]
是指第一场比赛,$¢[1]
第二场比赛等等。
在正则表达式代码块内,$/
将引用最直接的匹配项。在上述情况下,这是内的匹配,( )
并且不知道其他匹配,也不知道匹配的原始开始:仅是( )
块的开始。因此,给出一个更复杂的正则表达式:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
我们可以在任何时候使用$¢ foo
令牌来访问$¢<foo>
。我们可以访问bar
给定的令牌foo
使用$¢<foo>[0]<bar>
。如果我们在foo
的捕获中插入一个代码块,则可以bar
使用$<bar>
或来访问令牌$/<bar>
,但不能访问其他foo
s。
$¢
每个令牌都需要更新,因此您必须$*TOP := $¢
在TOP
令牌中说,但这当然不能摆脱对$*TOP
var 的需要。我同意能够在顶级引用比赛是很棒的。最终,问题仍然是您所识别的问题:当位置/哈希匹配时,发布到匹配对象。当使用$¢
(按令牌)时,根据定义,结果将{ }
在遇到其封闭块后立即发布。
Binex
,我发现在遇到匹配结果后立即发布匹配结果在计算上没有任何差劲。在一天结束时,您要推送/弹出到缓存的列表/哈希,或者您要推送/弹出到比赛的列表/哈希。但是,可能有某种我不知道的用于LTM的内部加速,这可能是它的核心({ }
出于LTM的目的而终止令牌,因此比起运行/测试,它更可能运行/测试)令牌的其余部分|
分组)
$¢
是动态的,当它不起作用时感到惊讶。但是一分钱现在不再是词汇了,正如您使用“最外层”一词所猜想的那样,正如您所解释的那样,它建立在每条规则的开头。
$¢
和$/
绑定到相同的对象,即这个新的匹配对象,该对象将记录此规则匹配的内容并随着规则的进行捕获。然后,随着匹配的进行,将$¢
始终绑定到该总体匹配对象,而$/
每次创建新的匹配对象时都会反弹,因此,正如您所说的,它始终对应于最新的匹配对象。对?
$/
和之间的主要区别$¢
是:范围仅在正则表达式中具有一个值”,这意味着$¢
它只是一个残留痕迹Cursor
。当我阅读您的答案时,我想$¢
这可能是$*TOP
我在A中创造的可能的改进吗?我对SO的回答部分“为什么/如何在将重复的任意性格与捕获组进行匹配时需要一个附加变量?”。但是我尝试替换$*TOP
为$¢
失败。你明白我的意思吗?你能使它工作吗?