2016-10-04 15 views
7

Tôi vừa gặp phải một tình huống trong đó and&& hoạt động khác với các cảnh báo.Cảnh báo về khoảng trống chỉ với các nhà khai thác ngắn mạch có mức ưu tiên thấp

Đây là tập lệnh gốc với 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"); 

vì điều kiện đầu tiên là sai, biểu thức thứ hai trong và không bao giờ được đánh giá.

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

Tuy nhiên, nếu tôi thay đổi hoạt động sang ưu tiên cao hơn nhưng nếu không giống hệt &&, tôi sẽ không nhận được cảnh báo ngữ cảnh trống.

#!/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"); 

Chương trình tạo kết quả mong đợi, "undefined\n".

% perl defined.pl 
undefined 

perldoc perlop gợi ý rằng and&& nên giống hệt nhau trong tất cả các khía trừ được ưu tiên, nhưng không nêu nó một cách rõ ràng.

Là lựa chọn thay thế cho & & và || khi được sử dụng cho dòng điều khiển, Perl cung cấp và và hoặc các nhà điều hành (xem bên dưới). Hành vi ngắn mạch là giống hệt nhau. Các ưu tiên của "và" và "hay" thấp hơn nhiều, tuy nhiên, vì vậy mà bạn có thể an toàn sử dụng chúng sau khi một nhà điều hành danh sách mà không cần cho ngoặc:

+2

* "nếu tôi thay đổi thao tác thành mức ưu tiên thấp hơn, nếu không thì' && '" * Toán tử '&&' có * ưu tiên * cao hơn 'và'. – Borodin

+2

"' perldoc perlop' gợi ý rằng 'và' và' && 'phải giống hệt nhau trong tất cả các khía cạnh ngoại trừ ưu tiên, nhưng không nói rõ nó." Tôi không chắc bạn muốn nó rõ ràng hơn bao nhiêu. Nó nói rõ ràng "Ưu tiên của' và' và 'hoặc' ** thấp hơn nhiều **". –

+0

Nó không nêu trong tài liệu rằng 'undef' được xử lý theo cùng một cách bởi' && 'và' và' liên quan đến cảnh báo. Tôi nghĩ rằng có thể hiểu rằng họ luôn có thể trả về cùng các giá trị như nhau và đánh giá lập luận đúng của họ trong cùng hoàn cảnh nhưng tương tác với các cảnh báo khác nhau. Tôi đã sai, nhưng tôi nghĩ tại thời điểm đó đó là một khả năng. –

Trả lời

12

Toán tử gán có higher precedence hơn and, nên

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

tương đương với

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

Bạn có thể thấy điều này với 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 
Các vấn đề liên quan