Normal ifadede $ / ve $ ¢ arasındaki fark nedir?


11

Başlığın da gösterdiği gibi, $/ve arasındaki fark nedir? Her zaman aynı değere sahip gibi görünüyorlar:

my $text = "Hello world";

$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;

Her ikisi de aynı değerlere sahip Eşleme nesneleri ile sonuçlanır. Birini diğerinin üzerinde kullanmanın mantığı nedir?

Yanıtlar:


11

Değişken $/en son eşleşmeyi ifade ederken, değişken en son eşleşmeyi ifade eder. Yukarıdaki gibi çoğu normal regex'lerde, bu bir ve aynı olabilir. Ancak, .rakuyöntemin çıktısında görülebileceği gibi , Matchnesneler başka Matchnesneler de içerebilir (kullandığınızda $<foo>veya $1yakalamalarda elde ettiğiniz şey budur ).

Bunun yerine, nicelikli bir yakalama ile aşağıdaki normal ifadeye sahip olduğumuzu varsayalım

/ ab (cd { say $¢.from, " ", $¢.to } ) + /

Ve "abcdcdcd" ile eşleşirsek aşağıdaki çıktıyı görecek şekilde koştu:

0 2
0 4
0 6

Kullandığımız değiştirmek Ama eğer için $/, biz farklı bir sonuç almak:

2 2
4 4
6 6

( .toBiraz kapalı gibi görünmesinin nedeni .pos, yakalama bloğunun sonuna kadar güncellenmemesidir.)

Başka bir deyişle, her zaman son eşleme nesnenizin ne olacağına atıfta bulunacaktır (yani, $final = $text ~~ $regex), tam eşleşmeyi bitirdikten sonra yaptığınız gibi normal ifadenin içinde karmaşık bir yakalama ağacından geçebilirsiniz. Yukarıdaki örnekte, do $¢[0]ilk maçında başvurmak için $¢[1]ikinci vb

Normal ifade kod bloğunun $/içinde en yakın eşleşmeyi ifade eder. Yukarıdaki durumda, bu içerideki maçtır ( )ve diğer maçlar veya eşleşmenin orijinal başlangıcı hakkında bilgi sahibi olmayacaktır: sadece ( )blok için başlangıç . Bu yüzden daha karmaşık bir normal ifade verin:

/ a $<foo>=(b $<bar>=(c)+ )+ d /

Herhangi bir noktada $ ¢ kullanarak foojetonların tümünü kullanarak söyleyebiliriz $¢<foo>. Biz erişebileceği barbelirli bir bölgesinin belirteçleri fookullanarak $¢<foo>[0]<bar>. foo'İn yakalanmasının içine bir kod bloğu bareklersek, $<bar>veya tuşlarını kullanarak belirteçlere erişebilir $/<bar>, ancak diğer kodlara erişemez foo.


1
Ohhh! Ben "arasındaki temel fark doktorun yorumlanır $/ve kapsamı: ikincisi sadece regex içinde bir değere sahiptir" ortalamaya sadece körelmiş bir iz vardı tıpkı Cursorolduğunu. Cevabını okuduğumda düşündüm olurdu $*TOPoluşturulan ben Olası bir gelişme? bölümünde Cevabıma SO için "eşleştirme gerekli ek bir değişkendir nasıl Why / yakalama gruplarıyla keyfi karakterini tekrarlanan?". Ama benim girişimleri yerine $*TOPile başarısız oldu. Bu cevaptaki amacımı anlıyor musunuz? İşe yarayabilir misin?
raiph

Raiph: Yani gramerlerde, sen söylemek olurdu böylece, her simge için yenilenir $*TOP := $¢içinde TOPbelirteç ama bunun için ihtiyaç kurtulmak değil $*TOPelbette var. Maçlara en üst düzeyde atıfta bulunmanın harika olacağını kabul ediyorum. Sorun, nihayetinde hala tanımladığınız sorudur: konum / karma eşleşmeleri eşleme nesnesine gönderildiğinde. Kullanırken - tanım yazılan tarafından parça yakında olacak kadar sonuçları: - başına belirteci olan { }blok karşılaşılmaktadır.
user0721090601

Benim için ilginç olan şey, gelişmede Binex, karşılaşmalarla hemen karşılaştığında maç sonuçları yayınlamanın hesaplama açısından daha kötü olduğunu bulamadım. Günün sonunda, önbelleğe alınmış bir listeye / karmaya itiyorsunuz / çıkarıyorsunuz ya da Match'in listesine / hash'a aktarıyorsunuz / atıyorsunuz. Ancak, LTM için kullanıldığının farkında olmayan bir tür iç hız olabilir, bunun çekirdeği büyük olabilir ( { }LTM amaçları için bir jetonu sonlandırır ve bu nedenle çalıştırılmaya / test edilmeye daha yatkındır. bir |grupta jetonun geri kalanı )
user0721090601

Ahhh. Sonuca atlamıştım dinamikti ve işe yaramadığında şaşırdım. Ama kuruş şimdi "en dıştaki" kelimesini kullandığınızı tahmin edebileceğim gibi sözcüksel olduğunu düştü ve açıkladığınız gibi her kuralın başında kuruldu.
raiph

Bu nedenle, iiuc, bir kuralın başında, eşleşen motorun imleç konumunu orijinal giriş dizesi içine kaydeden yeni bir eşleştirme nesnesi oluşturulur, ancak aksi halde boştur. (Doğru mu?) O zaman ve $/aynı nesneye, yani bu kuralın ilerledikçe ne eşleşip yakaladığını kaydedecek olan bu yeni eşleşme nesnesine bağlanır. Daha sonra, eşleşme ilerledikçe, bu genel eşleme nesnesine bağlı kalır, ancak $/yeni bir eşleşme nesnesi her oluşturulduğunda geri döner, böylece her zaman en son eşleme nesnesine karşılık gelir. Sağ?
raiph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.