La variable $/
fait référence à la correspondance la plus récente tandis que la variable $¢
fait référence à la correspondance la plus récente la plus externe. Dans la plupart des expressions rationnelles de base comme ci-dessus, cela peut être la même chose. Mais comme on peut le voir à la sortie de la .raku
méthode, les Match
objets peuvent contenir d'autres Match
objets (c'est ce que vous obtenez lorsque vous utilisez $<foo>
ou $1
pour les captures).
Supposons à la place que nous ayons le regex suivant avec une capture quantifiée
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
Et couru, il verrait la sortie suivante si nous comparions avec "abcdcdcd":
0 2
0 4
0 6
Mais si nous passons de l'utilisation $¢
à $/
, nous obtenons un résultat différent:
2 2
4 4
6 6
(La raison pour laquelle .to
semble être un peu décalée est qu'elle .pos
- et - n'est pas mise à jour avant la fin du bloc de capture.)
En d'autres termes, $¢
fera toujours référence à ce qui sera votre objet de correspondance final (c'est-à-dire $final = $text ~~ $regex
) afin que vous puissiez traverser un arbre de capture complexe à l'intérieur de l'expression régulière exactement comme vous le feriez après avoir terminé la correspondance complète. Ainsi, dans l'exemple ci-dessus, vous pouvez simplement faire $¢[0]
pour se référer à la première correspondance, $¢[1]
la seconde, etc.
À l'intérieur d'un bloc de code regex, $/
fera référence à la correspondance la plus immédiate. Dans le cas ci-dessus, c'est la correspondance pour l'intérieur du ( )
et ne connaîtra pas les autres correspondances, ni le début d'origine de la correspondance: juste le début du ( )
bloc. Donnez donc une expression rationnelle plus complexe:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Nous pouvons accéder à tout moment en utilisant $ ¢ tous les foo
jetons en disant $¢<foo>
. Nous pouvons accéder aux bar
jetons d'un donné foo
en utilisant $¢<foo>[0]<bar>
. Si nous insérons un bloc de code à l'intérieur de foo
la capture de, il pourra accéder aux bar
jetons en utilisant $<bar>
ou $/<bar>
, mais il ne pourra pas accéder à d'autres foo
s.
$/
et$¢
est la portée: ce dernier n'a qu'une valeur à l'intérieur de l'expression régulière" pour signifier$¢
n'était qu'une trace résiduelle, tout commeCursor
c'est. Quand j'ai lu votre réponse, je pensais que ce$¢
serait le$*TOP
je créé dans l' amélioration possible? section de ma réponse au SO "Pourquoi / comment une variable supplémentaire est-elle nécessaire pour faire correspondre le caractère arbitraire répété avec les groupes de capture?". Mais mes tentatives de remplacement$*TOP
par ont$¢
échoué. Comprenez-vous mon propos dans cette réponse? Pouvez-vous le faire fonctionner?