A variável $/
refere-se à correspondência mais recente, enquanto a variável $¢
refere-se à correspondência mais externa mais recente. Nas regexes mais básicas, como a acima, isso pode ser o mesmo. Mas, como pode ser visto na saída do .raku
método, os Match
objetos podem conter outros Match
objetos (é o que você obtém quando usa $<foo>
ou $1
para capturas).
Suponhamos que tivéssemos a seguinte expressão regular com uma captura quantificada
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
E executou, veria a seguinte saída se comparássemos com "abcdcdcd":
0 2
0 4
0 6
Mas se mudarmos de usar $¢
para $/
, obteremos um resultado diferente:
2 2
4 4
6 6
(O motivo pelo qual .to
parece um pouco errado é que ele .pos
- e - não é atualizado até o final do bloco de captura).
Em outras palavras, $¢
irá sempre se referir ao que será seu objeto partida final (ou seja, $final = $text ~~ $regex
) para que você possa percorrer um complexo dentro árvore captura do regex exatamente como seria depois de ter terminado o jogo completo Assim, no exemplo acima, você poderia apenas faça $¢[0]
para se referir à primeira partida, $¢[1]
à segunda, etc.
Dentro de um bloco de código regex, $/
fará referência à correspondência mais imediata. No caso acima, essa é a partida para dentro da ( )
e não saberá sobre as outras partidas, nem o início original da partida: apenas o começo do ( )
bloco. Portanto, dê uma regex mais complexa:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Podemos acessar a qualquer momento usando $ ¢ todos os foo
tokens dizendo $¢<foo>
. Podemos acessar os bar
tokens de um dado foo
usando $¢<foo>[0]<bar>
. Se inserirmos um bloco de código dentro da foo
captura, ele poderá acessar os bar
tokens usando $<bar>
ou $/<bar>
, mas não poderá acessar outros foo
.
$/
e$¢
é o escopo: o último só tem um valor dentro do regex" para significar que$¢
era apenas um vestígio vestigial, exatamente comoCursor
é. Quando li sua resposta, pensei$¢
que seria o que$*TOP
eu criei na possível melhoria? seção da minha resposta para a SO "Por que / como é necessária uma variável adicional para combinar caracteres arbitrários repetidos com grupos de captura?". Mas minhas tentativas de substituir$*TOP
por$¢
falharam. Você entende meu ponto nessa resposta? Você pode fazer isso funcionar?