Die Variable $/
bezieht sich auf die letzte Übereinstimmung, während sich die Variable $¢
auf die letzte äußerste Übereinstimmung bezieht. In den meisten einfachen regulären Ausdrücken wie den oben genannten kann dies ein und dasselbe sein. Wie aus der Ausgabe der .raku
Methode hervorgeht, können Match
Objekte andere Match
Objekte enthalten (das erhalten Sie bei der Verwendung $<foo>
oder $1
für Captures).
Nehmen wir stattdessen an, wir hätten den folgenden regulären Ausdruck mit einer quantifizierten Erfassung
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
Und lief es würde die folgende Ausgabe sehen, wenn wir mit "abcdcdcd" übereinstimmen:
0 2
0 4
0 6
Aber wenn wir verwenden , ändern $¢
zu $/
, bekommen wir ein anderes Ergebnis:
2 2
4 4
6 6
(Der Grund dafür .to
scheint zu sein, dass es - und .pos
- erst am Ende des Erfassungsblocks aktualisiert wird.)
Mit anderen Worten, $¢
wird immer beziehen sich auf dem, was Ihr Endspiel Objekt (dh sein $final = $text ~~ $regex
) , so dass Sie einen komplexen Erfassung Baum innerhalb der Regex genau durchqueren können , wie Sie nach der vollständigen Übereinstimmung So im obigen Beispiel beendet haben würden, könnten Sie einfach tun, $¢[0]
um sich auf das erste Spiel, $¢[1]
das zweite usw. zu beziehen .
In einem Regex-Codeblock $/
wird auf die unmittelbarste Übereinstimmung verwiesen . Im obigen Fall ist dies die Übereinstimmung für das Innere der ( )
und es werden weder die anderen Übereinstimmungen noch der ursprüngliche Beginn der Übereinstimmung bekannt: nur der Start für den ( )
Block. Geben Sie also einen komplexeren regulären Ausdruck an:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Wir können jederzeit mit $ ¢ auf alle foo
Token zugreifen, indem wir sagen $¢<foo>
. Wir können die bar
Zugriffstoken eines bestimmten foo
unter Verwendung $¢<foo>[0]<bar>
. Wenn wir einen Codeblock in foo
die Erfassung einfügen , kann er bar
mit $<bar>
oder auf Token zugreifen $/<bar>
, aber nicht auf andere foo
s.
$/
und$¢
ist Umfang: Letzteres hat nur einen Wert innerhalb des regulären Ausdrucks"$¢
als bloße Spur, so wie esCursor
ist. Als ich Ihre Antwort las, dachte ich,$¢
wäre das, was$*TOP
ich in der A möglichen Verbesserung geschaffen habe? Abschnitt meiner Antwort auf die SO "Warum / wie wird eine zusätzliche Variable benötigt, um wiederholte willkürliche Zeichen mit Erfassungsgruppen abzugleichen?". Aber meine Versuche zu ersetzen$*TOP
mit$¢
fehlgeschlagen. Verstehst du meinen Punkt in dieser Antwort? Schaffst du es zum Laufen?