正如标题所示,$/和之间有什么区别$¢?它们似乎总是具有相同的值:
my $text = "Hello world";
$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;
Run Code Online (Sandbox Code Playgroud)
两者都会产生具有相同值的 Match 对象。使用一个而不是另一个的逻辑是什么?
use*_*601 13
变量$/指的是最近的匹配,而变量$¢指的是最近的最外面的匹配。在像上面这样的大多数基本正则表达式中,这可能是一个和相同的。但是从.raku方法的输出中可以看出,Match对象可以包含其他Match对象(这是您在使用$<foo>或$1捕获时获得的)。
假设我们有以下带有量化捕获的正则表达式
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
Run Code Online (Sandbox Code Playgroud)
如果我们匹配“abcdcdcd”,运行它会看到以下输出:
0 2
0 4
0 6
Run Code Online (Sandbox Code Playgroud)
但是如果我们从 using$¢改为$/,我们会得到不同的结果:
2 2
4 4
6 6
Run Code Online (Sandbox Code Playgroud)
(.to似乎有点偏离的原因是它——而且.pos——直到捕获块结束才更新。)
换句话说,$¢将始终引用您的最终匹配对象(即$final = $text ~~ $regex),这样您就可以像完成完整匹配后一样在正则表达式中遍历复杂的捕获树 所以在上面的示例中,您可以do$¢[0]指的是第一场比赛,$¢[1]第二场比赛,等等。
在正则表达式代码块内,$/将引用最直接的匹配项。在上述情况下,这是 inside 的匹配,( )并且不知道其他匹配,也不知道匹配的原始开始:只是( )块的开始。所以给出一个更复杂的正则表达式:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Run Code Online (Sandbox Code Playgroud)
我们可以foo通过说使用 $¢ 随时访问所有令牌$¢<foo>。我们可以访问bar给定的令牌foo使用$¢<foo>[0]<bar>。如果我们在foo的 capture 中插入一个代码块,它将能够bar通过使用$<bar>或访问令牌$/<bar>,但将无法访问其他foos。
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |