2013-10-11 56 views
6

下面是示例。由於一些奇怪的原因,Perl認爲1 and 0是一個真正的價值。爲什麼?在你的榜樣爲什麼Perl認爲`1和0`是真的?

$ perl -e '$x = 1 and 0; print $x;' 
1 
+1

注意,它確實給一個警告。不幸的是,它並沒有給出「在無效上下文中無用......」的錯誤,因爲該警告被抑制爲'0;'(和'1;')。 – ikegami

+0

那麼,它只會在以'perl -we ...'運行時發出警告(並且警告是'Found = in conditional,應該是在-e行1處)。在我的示例'perl -e ...'中,我沒有得到任何警告。 – bessarabov

+1

您的意思是?你應該總是使用'use strict;使用警告;'。而且,如果你不知道發生了什麼,那就更是如此。更不用說檢查錯誤了。 (這裏不適用,但是當人們甚至不檢查錯誤時,人們會問很多次錯誤!) – ikegami

回答

11

運算符優先級

perl -e '($x = 1) and 0; print $x;' 

,而你想要的是:

perl -e '$x = (1 and 0); print $x;' 

perl -e '$x = 1 && 0; print $x;' 
+0

@bessarabov如果它適合你,你可以接受答案。 –

12

由於and和優先不同:

$x = 1 and 0就像($x = 1) and 0,而$x = 1 && 0就像$x = (1 && 0)

參見perlop(1)

+6

特別是,賦值運算符('=')的優先級低於'&&',但優先級高於'和'。 – amitparikh

6

它並不:

$ perl -e '$x = (1 and 0); print $x;' 
0