正则表达式中的 $/ 和 $¢ 有什么区别?
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>
访问给定 foo
的 bar
标记。如果我们在 foo
的捕获中插入代码块,它将能够通过使用 $<bar>
或 $/<bar>
访问 bar
令牌,但它不能访问其他 foo
s.
如题所示,$/
和$¢
有什么区别?它们似乎总是具有相同的值:
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>
访问给定 foo
的 bar
标记。如果我们在 foo
的捕获中插入代码块,它将能够通过使用 $<bar>
或 $/<bar>
访问 bar
令牌,但它不能访问其他 foo
s.