正则表达式中的$ /和$¢有什么区别?


11

如标题所示,$/和之间有什么区别?它们似乎总是具有相同的值:

my $text = "Hello world";

$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;

两者都会导致Match对象具有相同的值。在一个之上使用一个之上的逻辑是什么?

Answers:


11

变量$/引用最新的匹配项,而变量引用最新的最外部匹配项。在像上面这样的大多数基本正则表达式中,可能是相同的。但是从该.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>,但不能访问其他foos。


1
哦!我解释了该文档的“ $/和之间的主要区别是:范围仅在正则表达式中具有一个值”,这意味着它只是一个残留痕迹Cursor。当我阅读您的答案时,我想这可能是$*TOP我在A中创造的可能的改进吗?对SO的回答部分“为什么/如何在将重复的任意性格与捕获组进行匹配时需要一个附加变量?”。但是我尝试替换$*TOP失败。你明白我的意思吗?你能使它工作吗?
雷夫

Raiph:因此在语法上,每个令牌都需要更新,因此您必须$*TOP := $¢TOP令牌中说,但这当然不能摆脱对$*TOPvar 的需要。我同意能够在顶级引用比赛是很棒的。最终,问题仍然是您所识别的问题:当位置/哈希匹配时,发布到匹配对象。当使用(按令牌)时,根据定义,结果将{ }在遇到其封闭块后立即发布。
user0721090601

对我来说有趣的是,在开发过程中Binex,我发现在遇到匹配结果后立即发布匹配结果在计算上没有任何差劲。在一天结束时,您要推送/弹出到缓存的列表/哈希,或者您要推送/弹出到比赛的列表/哈希。但是,可能有某种我不知道的用于LTM的内部加速,这可能是它的核心({ }出于LTM的目的而终止令牌,因此比起运行/测试,它更可能运行/测试)令牌的其余部分|分组)
user0721090601

啊 我突然得出结论是动态的,当它不起作用时感到惊讶。但是一分钱现在不再是词汇了,正如您使用“最外层”一词所猜想的那样,正如您所解释的那样,它建立在每条规则的开头。
雷夫

因此,iiuc在规则开始时会创建一个新的match对象,该对象将匹配引擎的光标位置记录在原始输入字符串中,但否则为空。(对吗?)然后将$/绑定到相同的对象,即这个新的匹配对象,该对象将记录此规则匹配的内容并随着规则的进行捕获。然后,随着匹配的进行,将始终绑定到该总体匹配对象,而$/每次创建新的匹配对象时都会反弹,因此,正如您所说的,它始终对应于最新的匹配对象。对?
凌晨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.