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 .rakuméthode, les Matchobjets peuvent contenir d'autres Matchobjets (c'est ce que vous obtenez lorsque vous utilisez $<foo>ou $1pour 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 .tosemble ê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 foojetons en disant $¢<foo>. Nous pouvons accéder aux barjetons d'un donné fooen utilisant $¢<foo>[0]<bar>. Si nous insérons un bloc de code à l'intérieur de foola capture de, il pourra accéder aux barjetons en utilisant $<bar>ou $/<bar>, mais il ne pourra pas accéder à d'autres foos.
$/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 commeCursorc'est. Quand j'ai lu votre réponse, je pensais que ce$¢serait le$*TOPje 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$*TOPpar ont$¢échoué. Comprenez-vous mon propos dans cette réponse? Pouvez-vous le faire fonctionner?