<< 'm' = ~ m >> sözdizimi perl'de ne anlama geliyor?


82

Bu yüzden, perl'in çok alışılmadık bir sözdizimi olduğunu anlıyorum, ancak geçen gün iş yerinde kafamı karıştıran bir kod parçacığı ile karşılaştım. Biri bana bunun ne anlama geldiğini açıklayabilir mi?

<<'m'=~m>>
print $a unless $b;
return;
m
;

HEREDOC sözdizimine benziyor, ancak şimdiye kadar gördüğüm hiçbir biçimde değil.



1
Sen Perl gizli operatörleri ve sabitler bir listesine erişebilirsiniz burada .
aloisdg codidact.com'a taşınıyor

Yanıtlar:


124

Bu gizli sözdizimi, süslü çift kanatlı kılıç olarak bilinir ve tipik olarak şu şekilde gösterilir:

<<m=~m>>

Comments here

m
;

Yorumlu metin sözdizimini kullanan ve ayırıcı olarak operatörle ( =~) eşleştiren çok satırlı yorumlar için bir hacklemedir >.

Eğik çizgi /eşleştirme için sınırlayıcı olarak kullanılmadığından "m" operatörünün gerekli olduğunu unutmayın. Örneğin $my_var =~ /test/, eşdeğerdir $my_var =~ m>test>, oysa $my_var =~ >test>geçersizdir.

mSnippet'inizdeki ilk karakterin tek tırnak içine alınmış olmasına dikkat edin, yani $ave $bdeğişkenleri araya eklenmeyecektir. Bu tırnaklar ihmal edilmiş olsaydı (benim verdiğim kod örneğime göre) perl otomatik olarak bitiş işaretçisine çift tırnak eklerdi ve sonraki değişkenler enterpolasyonlu olurdu. Bu sorunlara yol açacağını $ave $bartık tanımlanır ve kullandığınız use warnings;.

Yukarıdaki süslü çift kanatlı örneği daha kolay anlamak için (ancak yine de tavsiye edilmemektedir), yazabiliriz:

<<"END" =~ //

Comments here

END
;

=~ //Gereksiz olduğunu unutmayın , bu nedenle şuna eşdeğerdir:

<<"END";

Comments here

END

Bu, geçersiz bağlamda sadece standart heredok sözdizimidir.

Void bağlamında bir dizeye sahip olmak sorunlara neden olabileceğinden, bunu üretim kodunda kullanmanızı önermem. Ayrıca bu kod, en deneyimli perl programcıları için bile kafa karıştırıcıdır ve okuması ve bakımı anlamsız bir şekilde zordur! Doğru çok satırlı yorumlar oluşturmak istiyorsanız, burada açıklandığı gibi bölmeye bağlı kalmanızı öneririm Perl'de çok satırlı bir yorumu nasıl girebilirim?

Umarım bu sorunu çözer.


24

B :: Deparse'ı çalıştırmak, perl'in bu kod parçasını nasıl işlediğini anlamak için çok yardımcı olur ("test.pl" dosyasında olduğunu varsayarak):

perl -MO=Deparse  test.pl 

bize göster:

"print \$a unless \$b;\nreturn;\n" =~ //;
test.pl syntax OK

Gördüğünüz gibi, perl boş bir normal ifadeyi bu dizeyle eşleştirmeye çalışıyor: "print \$a unless \$b;\nreturn;\n"

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.