2013-10-11 18 views
6

Đây là mẫu. Đối với một số lý do lạ Perl nghĩ rằng 1 and 0 là một giá trị thực sự. Tại sao?Tại sao Perl nghĩ rằng `1 và 0` là đúng?

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

Lưu ý rằng nó cung cấp cho một cảnh báo. Thật không may, nó không cung cấp lỗi "sử dụng vô dụng ... trong void context" vì cảnh báo đó bị chặn cho '0;' (và '1;'). – ikegami

+0

Vâng, nó chỉ cảnh báo khi chạy như 'perl-we ...' (và cảnh báo là 'Found = in conditional, nên được == tại -e dòng 1.'). Trong ví dụ của tôi 'perl -e ... 'Tôi không nhận được bất kỳ cảnh báo nào. – bessarabov

+1

Điểm của bạn là gì? Bạn nên luôn luôn sử dụng 'sử dụng nghiêm ngặt; sử dụng cảnh báo; Và gấp đôi vì vậy nếu bạn không biết những gì đang xảy ra. Chưa kể đến kiểm tra lỗi. (Không áp dụng ở đây, nhưng rất nhiều lần mọi người hỏi có gì sai khi họ thậm chí không kiểm tra lỗi!) – ikegami

Trả lời

11

điều hành được ưu tiên trong ví dụ của bạn được

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

trong khi những gì bạn muốn là:

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

hoặc

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

@bessarabov bạn có thể chấp nhận câu trả lời nếu nó phù hợp với bạn. –

12

Bởi vì ưu tiên của and&& khác nhau:

$x = 1 and 0 giống như ($x = 1) and 0, trong khi $x = 1 && 0 giống như $x = (1 && 0).

Xem perlop(1).

+6

Và cụ thể, toán tử gán ('=') có mức ưu tiên thấp hơn '&&', nhưng ưu tiên cao hơn 'và'. – amitparikh

6

Nó không:

$ perl -e '$x = (1 and 0); print $x;' 
0 
Các vấn đề liên quan