2016-10-04 43 views
7

我剛剛遇到and&&在警告方面表現不同的情況。僅針對低優先級短路運營商的空白背景的警告

這是原始腳本and

#!/usr/bin/env perl 
use strict; 
use warnings 'FATAL' => qw[all]; 

my $var1; 
my $var2; 

my $defined = (defined $var1) and (defined $var2); 

print ($defined ? "defined\n" : "undefined\n"); 

因爲第一個條件是假的,所以第二個表達式永遠不會被評估。

% perl defined.pl 
Useless use of defined operator in void context at defined.pl line 8. 
Exit 255 

但是,如果我改變運行到較高優先級但完全一樣&&,我沒有得到一個無效的情況下報警。

#!/usr/bin/env perl 
use strict; 
use warnings 'FATAL' => qw[all]; 

my $var1; 
my $var2; 

my $defined = (defined $var1) && (defined $var2); 

print ($defined ? "defined\n" : "undefined\n"); 

程序產生預期結果"undefined\n"

% perl defined.pl 
undefined 

perldoc perlop表明and&&應在除優先級所有方面完全相同,但沒有明確說明它。

作爲&的替代品&和|當用於控制流程時,Perl提供了 和和或運算符(見下文)。短路行爲是 相同。的優先級「和」和「或」低得多,然而, ,你可以放心地使用它們的列表操作後,無需 的括號:

+2

*「如果我將操作更改爲較低優先級,但其他情況相同'&&'」* * &&操作符的優先級高於*和*。 – Borodin

+2

「'perldoc perlop''表明'和'和'&&'應該在所有方面都是相同的,除了優先級,但沒有明確說明它。」我不確定你希望它有多明確。它清楚地說:「和'和'或'**的優先級要低得多**」。 –

+0

它沒有在文檔中聲明''undef''在處理''和''和'''和警告相同的方式。我認爲可以想象,他們總是可以在相同的情況下返回相同的價值觀並評估他們的正確論點,但是以不同的方式與警告進行交互。我錯了,但我當時認爲這是一種可能性。 –

回答

12

賦值運算符有higher precedenceand,所以

my $defined = (defined $foo) and (defined $bar); 

相當於

(my $defined = (defined $foo)) && (defined $bar); 

您可以B::Deparse看到這一點:

$ perl -MO=Deparse -e'my $defined = (defined $foo) && (defined $bar)'                
my $defined = defined $foo && defined $bar; 
-e syntax OK 

$ perl -MO=Deparse -e'my $defined = (defined $foo) and (defined $bar)' 
defined $bar if my $defined = defined $foo; 
-e syntax OK