Zmienna $/
odnosi się do ostatniego dopasowania, podczas gdy zmienna $¢
odnosi się do ostatniego najbardziej zewnętrznego dopasowania. W większości podstawowych wyrażeń regularnych, takich jak powyższe, może to być jedno i to samo. Ale jak widać na podstawie wyniku .raku
metody, Match
obiekty mogą zawierać inne Match
obiekty (to, co otrzymujesz, gdy używasz $<foo>
lub $1
do przechwytywania).
Załóżmy, że zamiast tego mieliśmy następujący regex z ujęciem ilościowym
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
I uruchomiłby, zobaczyłby następujące dane wyjściowe, gdybyśmy dopasowali do „abcdcdcd”:
0 2
0 4
0 6
Ale jeśli zmienimy z używania $¢
na $/
, otrzymamy inny wynik:
2 2
4 4
6 6
( .to
Wydaje się, że to trochę nie tak, ponieważ .pos
- i - nie są aktualizowane do końca bloku przechwytywania.)
Innymi słowy, zawsze$¢
będzie odnosił się do tego, jaki będzie twój ostateczny obiekt dopasowania (tj. ), Abyś mógł przechodzić przez złożone drzewo przechwytywania w wyrażeniu regularnym dokładnie tak, jak zrobiłbyś to po zakończeniu pełnego dopasowania. W powyższym przykładzie możesz po prostu zrobić, aby odnieść się do pierwszego dopasowania, drugiego itd.$final = $text ~~ $regex
$¢[0]
$¢[1]
Wewnątrz bloku kodu wyrażenia regularnego $/
będzie odnosić się do najbardziej bezpośredniego dopasowania. W powyższym przypadku jest to dopasowanie do wewnątrz ( )
i nie będzie wiadomo o innych dopasowaniach, ani o oryginalnym początku dopasowania: tylko początek ( )
bloku. Podaj więc bardziej złożony regex:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Możemy uzyskać dostęp w dowolnym momencie za pomocą $ ¢ wszystkich foo
tokenów, mówiąc $¢<foo>
. Możemy uzyskać dostęp do bar
tokenów danego foo
za pomocą $¢<foo>[0]<bar>
. Jeśli wstawimy blok kodu wewnątrz foo
przechwytywania, będzie on mógł uzyskać dostęp do bar
tokenów za pomocą $<bar>
lub $/<bar>
, ale nie będzie mógł uzyskać dostępu do innych foo
s.
$/
i$¢
jest zakres: ten ostatni ma tylko wartość w wyrażeniu regularnym”, co oznacza, że$¢
był jedynie śladowym śladem, tak jakCursor
jest. Kiedy czytam twoją odpowiedź, pomyślałem,$¢
że to$*TOP
ja stworzyłem w A możliwej poprawie? sekcja mojej odpowiedzi na pisemne zgłoszenie zastrzeżeń „Dlaczego / jak potrzebna jest dodatkowa zmienna w dopasowywaniu powtarzającego się arbitralnego znaku z grupami przechwytywania?”. Ale moje próby zastąpienia$*TOP
przez$¢
nie powiodły się. Czy rozumiesz mój punkt w tej odpowiedzi? Czy potrafisz sprawić, żeby działało?