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.