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

What's the difference between $/ and $¢ in regex?

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

my $text = "Hello world";

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

两者都会产生具有相同值的匹配对象。使用一个而不是另一个的逻辑是什么?

变量$/指的是最近的匹配,而变量指的是最近的最外层匹配。在像上面这样的大多数基本正则表达式中,它们可能是一样的。但是从 .raku 方法的输出可以看出, Match 对象可以包含其他 Match 对象(这就是你使用 $<foo></code> 用于捕获)。</p> <p>假设我们有以下带有量化捕获的正则表达式</p> <pre><code>/ ab (cd { say $¢.from, " ", $¢.to } ) + /

And 运行 如果我们匹配 "abcdcdcd":

它会看到以下输出
0 2
0 4
0 6

但是如果我们从使用 更改为 $/,我们会得到不同的结果:

2 2
4 4
6 6

.to 似乎有点偏离的原因是它 — 和 .pos — 直到捕获块结束才更新。)

换句话说, 始终 指的是最终匹配对象(即 $final = $text ~~ $regex),因此您可以遍历一个复杂的在正则表达式中捕获树,就像完成完整匹配后一样。所以在上面的例子中,你可以只做 $¢[0] 来引用第一个匹配,$¢[1] 第二个,等等

在正则表达式代码块内,$/ 将引用最直接的匹配项。在上面的例子中,这是 ( ) 内部的匹配并且不知道其他匹配,也不知道匹配的原始开始:只是 ( ) 块的开始。所以给出一个更复杂的正则表达式:

/ a $<foo>=(b $<bar>=(c)+ )+ d /

我们可以随时通过说 $¢<foo> 使用 $¢ 访问所有 foo 代币。我们可以使用 $¢<foo>[0]<bar> 访问给定 foobar 标记。如果我们在 foo 的捕获中插入代码块,它将能够通过使用 $<bar>$/<bar> 访问 bar 令牌,但它不能访问其他 foos.