问题
As the title indicates, what is the difference between $/
and $¢
? They appear to always have the same value:
my $text = "Hello world";
$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;
Both result in Match objects with the same values. What's the logic in using one over the other?
回答1:
The variable $/
refers to the most recent match while the variable $¢
refers to the most recent outermost match. In most basic regexes like the above, that may be one and the same. But as can be seen from the output of the .raku
method, Match
objects can contain other Match
objects (that's what you get when you use $<foo>
or $1
for captures).
Suppose instead we had the following regex with a quantified capture
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
And ran it would see the following output if we matched against "abcdcdcd":
0 2
0 4
0 6
But if we change from using $¢
to $/
, we get a different result:
2 2
4 4
6 6
(The reason the .to
seems to be a bit off is that it —and .pos
— are not updated until the end of the capture block.)
In other words, $¢
will always refer to what will be your final match object (i.e., $final = $text ~~ $regex
) so you can traverse a complex capture tree inside of the regex exactly as you would after having finished the full match So in the above example, you could just do $¢[0]
to refer to the first match, $¢[1]
the second, etc.
Inside of a regex code block, $/
will refer to the most immediate match. In the above case, that's the match for inside the ( )
and won't know about the other matches, nor the original start of the matching: just the start for the ( )
block. So give a more complex regex:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
We can access at any point using $¢ all of the foo
tokens by saying $¢<foo>
. We can access the bar
tokens of a given foo
by using $¢<foo>[0]<bar>
. If we insert a code block inside of foo
's capture, it will be able to access bar
tokens by using $<bar>
or $/<bar>
, but it won't be able to access other foo
s.
来源:https://stackoverflow.com/questions/61451103/whats-the-difference-between-and-%c2%a2-in-regex