Biến $/
đề cập đến trận đấu gần đây nhất trong khi biến $¢
đề cập đến trận đấu ngoài cùng gần nhất. Trong hầu hết các regex cơ bản như trên, đó có thể là một và giống nhau. Nhưng như có thể thấy từ đầu ra của .raku
phương thức, Match
các đối tượng có thể chứa các Match
đối tượng khác (đó là những gì bạn nhận được khi bạn sử dụng $<foo>
hoặc $1
để chụp).
Giả sử thay vào đó chúng ta đã có regex sau với một bản chụp được định lượng
/ ab (cd { say $¢.from, " ", $¢.to } ) + /
Và chạy nó sẽ thấy đầu ra sau nếu chúng ta khớp với "abcdcdcd":
0 2
0 4
0 6
Nhưng nếu chúng ta thay đổi từ sử dụng $¢
sang $/
, chúng ta sẽ nhận được một kết quả khác:
2 2
4 4
6 6
(Lý do .to
có vẻ hơi lạc lõng là vì nó và .pos
- không được cập nhật cho đến khi kết thúc khối chụp.)
Nói cách khác, $¢
sẽ luôn đề cập đến đối tượng phù hợp cuối cùng của bạn (nghĩa là $final = $text ~~ $regex
) để bạn có thể đi qua một cây bắt phức tạp bên trong regex chính xác như bạn đã làm sau khi kết thúc trận đấu đầy đủ. Trong ví dụ trên, bạn có thể chỉ cần làm $¢[0]
để chỉ trận đấu đầu tiên, $¢[1]
lần thứ hai, v.v.
Bên trong một khối mã regex, $/
sẽ đề cập đến trận đấu ngay lập tức nhất. Trong trường hợp trên, đó là trận đấu cho bên trong ( )
và sẽ không biết về các trận đấu khác, cũng không phải là điểm bắt đầu ban đầu của trận đấu: chỉ là sự khởi đầu cho ( )
khối. Vì vậy, đưa ra một biểu thức phức tạp hơn:
/ a $<foo>=(b $<bar>=(c)+ )+ d /
Chúng tôi có thể truy cập tại bất kỳ điểm nào bằng cách sử dụng $ ¢ tất cả các foo
mã thông báo bằng cách nói $¢<foo>
. Chúng tôi có thể truy cập bar
mã thông báo của một foo
bằng cách sử dụng $¢<foo>[0]<bar>
. Nếu chúng tôi chèn một khối mã bên trong bản foo
chụp, nó sẽ có thể truy cập bar
mã thông báo bằng cách sử dụng $<bar>
hoặc $/<bar>
, nhưng nó sẽ không thể truy cập vào các mã khác foo
.
$/
và$¢
là phạm vi: cái sau chỉ có một giá trị bên trong regex" có nghĩa$¢
chỉ là một dấu vết di tích, giống như vậyCursor
. Khi tôi đọc câu trả lời của bạn, tôi nghĩ$¢
sẽ là cái$*TOP
tôi tạo ra trong sự cải thiện có thể?phần câu trả lời của tôi cho SO "Tại sao / làm thế nào là một biến bổ sung cần thiết trong việc khớp ký tự tùy ý lặp đi lặp lại với các nhóm bắt giữ?". Nhưng những nỗ lực của tôi để thay thế$*TOP
bằng$¢
thất bại. Bạn có hiểu quan điểm của tôi trong câu trả lời đó không? Bạn có thể làm cho nó hoạt động?