2014-09-01 13 views
5

BenNeden "x = a veya b", Perl'de çalışmıyor? Diğer dillerde

testvar = onecondition OR anothercondition; 

ya koşul ise gerçek olamayacak TestVar olması yazardı. Ama Perl'de bu beklendiği gibi çalışmıyor.

İçerik değişkeninin boş olduğu veya belirli bir normal ifadeyle eşleştiği bir durumu kontrol etmek istiyorum. Bu örnek program var:

Ben true evals if() ile test "1" ya da bir şey içermesi $ res beklerdik
my $contents = "abcdefg\n"; 
my $criticalRegEx1 = qr/bcd/; 
my $cond1 = ($contents eq ""); 
my $cond2 = ($contents =~ $criticalRegEx1); 
my $res = $cond1 or $cond2; 
if($res) {print "One or the other is true.\n";} 

. Ama boş dizeyi içerir.

Bunu Perl'de nasıl yapabilirim? İfade etrafında

+4

Kontrol dışarı [operatör öncelik tablosu] (http: //perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity). '' Ile '' 'ile karşılaştırın. – user2864740

cevap

19

koyun parantez

my $res = ($cond1 or $cond2); 

veya daha yüksek önceliğe || operatörünü kullanmak,

kodunuzu (my $res = $cond1) or $cond2;, daha doğrusu olarak Perlde tarafından yorumlanır olarak
my $res = $cond1 || $cond2; 

,

perl -MO=Deparse -e '$res = $cond1 or $cond2;' 
$cond2 unless $res = $cond1; 

use warnings; kullanıyorduysanız olur da, $cond2 ilgili

Useless use of a variable in void context 
+5

İlginçtir ki, insanlar karşı problemden şikayet ettiğinde “ya” anahtar kelimesi Perl'e eklenmiştir. Perl 4 sadece '' 've' '' ya da yok. – tripleee

+0

Kodumda uyarıları kullanıyorum ve uyarıyı aldım. Ancak gerçek kodda (bu test kodu değil) ifadeler burada olduğu gibi bölünmez, bu yüzden orada hiçbir uyarı almadım. Ve bunun üzerine, bana ne anlatmaya çalıştığını anlamadım :) Tam cevap için teşekkürler. – jackthehipster

+2

@jackthehipster 'tanılama kullanın;' uyarı konusunda daha açıklayıcı olacaktır. –

1

@jackthehipster uyarmak: Sadece $cond1 or $cond2 için parantez koymak doğru her şeyi yaptık kod aşağıda gösterildiği gibi:

my $contents = "abcdefg\n"; 
my $criticalRegEx1 = qr/bcd/; 
my $cond1 = ($contents eq ""); 
my $cond2 = ($contents =~ $criticalRegEx1); 
my $res = ($cond1 or $cond2); 
if($res) {print "One or the other is true.\n";}