La variable se $/
refiere a la coincidencia más reciente, mientras que la variable se $¢
refiere a la coincidencia externa más reciente. En la mayoría de las expresiones regulares como la anterior, puede ser una y la misma. Pero como se puede ver en la salida del .raku
método, los Match
objetos pueden contener otros Match
objetos (eso es lo que obtienes cuando usas $<foo>
o $1
para las capturas).
Supongamos que tenemos la siguiente expresión regular con una captura cuantificada
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
Y ejecutado, vería el siguiente resultado si coincidiéramos con "abcdcdcd":
0 2
0 4
0 6
Pero si cambiamos de usar $¢
a $/
, obtenemos un resultado diferente:
2 2
4 4
6 6
(La razón por la que .to
parece estar un poco apagado es que, y .pos
- no se actualizan hasta el final del bloque de captura).
En otras palabras, $¢
será siempre referirse a lo que será el objeto final del partido (es decir, $final = $text ~~ $regex
) para que pueda atravesar un complejo en el interior del árbol de captura de la expresión regular exactamente como después haría después de haber terminado el partido completo Así en el ejemplo anterior, sólo podía hacer $¢[0]
para referirse al primer partido, $¢[1]
el segundo, etc.
Dentro de un bloque de código regex, $/
se referirá a la coincidencia más inmediata. En el caso anterior, esa es la coincidencia para dentro ( )
y no sabrá sobre las otras coincidencias, ni el inicio original de la coincidencia: solo el inicio del ( )
bloque. Así que da una expresión regular más compleja:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Podemos acceder en cualquier momento usando $ ¢ todos los foo
tokens diciendo $¢<foo>
. Podemos acceder a los bar
tokens de un determinado foo
mediante $¢<foo>[0]<bar>
. Si insertamos un bloque de código dentro de foo
la captura de 's, podrá acceder a los bar
tokens usando $<bar>
o $/<bar>
, pero no podrá acceder a otros foo
s.
$/
y$¢
es el alcance: este último solo tiene un valor dentro de la expresión regular" en el sentido de que$¢
era simplemente un rastro vestigial, tal comoCursor
es. Cuando leí tu respuesta, pensé$¢
que sería la$*TOP
que creé en ¿ Una posible mejora? sección de mi respuesta a SO "¿Por qué / cómo se necesita una variable adicional para unir caracteres arbitrarios repetidos con grupos de captura?". Pero mis intentos de reemplazar$*TOP
con$¢
fracasaron. ¿Entiendes mi punto en esa respuesta? ¿Puedes hacer que funcione?