2015-09-19 19 views
82

Yani o perl çok olağandışı sözdizimi vardır anlıyorum ama beni karıştı bıraktığını Geçen gün iş yerinde bir kod parçacığı karşılaştım. Bu yorumlu metin gibi görünüyor, ama herhangi bir biçimde şimdiye kadar gördüğüm değil<<'m'=~m>> sözdizimi perl'de ne anlama geliyor?

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

: Birisi ne anlama geldiğini bana açıklayabilir misiniz.

<<m=~m>> 

Comments here 

m 
; 

O heredoc sözdizimi ve maç operatörü yararlanarak, çok satırlı yorumlar için kesmek (=~):

+2

[Garip Perl çok satırlı yorum mekanizmasını anlama] 'nın olası kopyası (http: // stackoverflow // arama: .com/sorular/5443121/anlama-garip-perl-satırlı-comment-mekanizma) – Gilles

+1

Sen Perl gizli operatörler ve sabitler [burada] (http bir listesine erişebilirsiniz.cpan.org/dist/perlsecret/lib/perlsecret.pod). – aloisdg

cevap

124

Bu gizli sözdizimi ornate double-bladed sword olarak bilinir ve genellikle olarak gösterilir sınırlayıcı olarak > ile.

Not: Eğik çizgiler olarak /, eşleşme için sınırlayıcı olarak kullanılmıyor, 'm' işleci gerekiyor. Örneğin $my_var =~ /test/, $my_var =~ m>test>'a eşdeğerdir, oysa $my_var =~ >test> geçersiz olur.

Snippet'inizdeki ilk m karakterinin tek tırnak içine alındığından, $a ve $b değişkenlerinin enterpolasyona girmeyeceğine dikkat edin. Bu alıntılar atlandıysa (verilen kod örneğime göre) perl otomatik olarak son işaretleyiciye çift tırnak işareti ekler ve sonraki değişkenler enterpole edilirdi. Bu, $a ve $b artık tanımlı değil ve use warnings; kullanıyorsunuz sorunlara neden olur. =~ // gereksiz olduğunu

<<"END" =~ // 

Comments here 

END 
; 

Not, bu nedenle bu eşdeğerdir:

anlama (ama yine de tavsiye edilmez) daha kolay üstünde süslü çift bıçaklı örnek olmak için, yazabiliriz

hükümsüz bağlamda sadece standart metin sözdizimidir olduğunu
<<"END"; 

Comments here 

END 

.

Ben sorunlara yol açabilir boşluk bağlamda bir dize sahip olarak üretim kodunda bu kullanarak tavsiye etmem. Ayrıca bu kod, en deneyimli perl programcıları için bile bir kafa çizicidir ve okumak ve sürdürmek anlamsızdır! Uygun çok hatlı bir yorum oluşturmak istiyorsanız o zaman ben burada bu o kadar temizler How do I enter a multi-line comment in Perl?

Umut açıklandığı gibi pod yapışmasını öneririm. B::Deparse Running

24

perl kod parçası ele nasıl anlamak için çok yardımcı olur (bu "test.pl" dosyasına olduğunu varsayarak):

perl -MO=Deparse test.pl 

bize göstermek:

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

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

İlgili konular