La variabile si $/
riferisce alla corrispondenza più recente mentre la variabile si $¢
riferisce alla corrispondenza più recente più recente. Nella maggior parte delle regex di base come sopra, può essere la stessa cosa. Ma come si può vedere dall'output del .raku
metodo, gli Match
oggetti possono contenere altri Match
oggetti (questo è ciò che si ottiene quando si utilizza $<foo>
o $1
per le acquisizioni).
Supponiamo invece di avere la seguente regex con una cattura quantificata
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
E se funzionasse vedrebbe il seguente output se ci abbinassimo a "abcdcdcd":
0 2
0 4
0 6
Ma se passiamo dall'uso $¢
a $/
, otteniamo un risultato diverso:
2 2
4 4
6 6
(Il motivo per cui .to
sembra essere un po 'spento è che —e-- .pos
non vengono aggiornati fino alla fine del blocco di acquisizione.)
In altre parole, $¢
farà sempre riferimento a quello che sarà il tuo oggetto di corrispondenza finale (ovvero, $final = $text ~~ $regex
) in modo da poter attraversare un albero di acquisizione complesso all'interno del regex esattamente come faresti dopo aver terminato la corrispondenza completa Quindi nell'esempio sopra, potresti semplicemente fare $¢[0]
riferimento alla prima partita, $¢[1]
alla seconda, ecc.
All'interno di un blocco di codice regex, $/
farà riferimento alla corrispondenza più immediata. Nel caso sopra, questa è la partita all'interno ( )
e non saprà delle altre partite, né l'inizio originale della corrispondenza: solo l'inizio del ( )
blocco. Quindi dai una regex più complessa:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Possiamo accedere in qualsiasi momento usando $ ¢ tutti i foo
token dicendo $¢<foo>
. Possiamo accedere ai bar
token di un dato foo
usando $¢<foo>[0]<bar>
. Se inseriamo un blocco di codice all'interno foo
dell'acquisizione, sarà in grado di accedere ai bar
token utilizzando $<bar>
o $/<bar>
, ma non sarà in grado di accedere ad altri foo
.
$/
e$¢
è ambito: quest'ultimo ha solo un valore all'interno della regex", il che significa che$¢
era semplicemente una traccia rudimentale, così comeCursor
è. Quando ho letto la tua risposta ho pensato$¢
che$*TOP
avrei creato il possibile miglioramento? sezione della mia risposta alla comunicazione degli addebiti "Perché / come è necessaria una variabile aggiuntiva per abbinare il carattere arbitrario ripetuto ai gruppi di cattura?". Ma i miei tentativi di sostituzione$*TOP
con$¢
falliti. Capisci il mio punto in quella risposta? Puoi farlo funzionare?