2008-08-12 10 views

Trả lời

80

Điều này được giải thích trong Perl documentation.

Do Perl điều hành ưu tiên tuyên bố đã được phân tích cú pháp như

($condition ? $a= 2 : $a) = 3 ; 

Bởi vì: nhà điều hành sản xuất một kết quả có thể chuyển nhượng, 3 được gán cho là kết quả của tình trạng này.

Khi $ điều kiện là đúng phương tiện này ($ a = 2) = 3 hiến $ a = 3

Khi $ điều kiện là sai phương tiện này ($ a) = 3 hiến $ a = 3

Cách chính xác để viết điều này là

$a = ($condition ? 2 : 3); 
print $a; 

Chúng tôi bị cắn bởi công việc này, vì vậy tôi đăng bài ở đây hy vọng những người khác sẽ thấy nó hữu ích.

+1

"Khi $ điều kiện là đúng điều này có nghĩa $ a = 2 = 3 hiến $ a = 3" tôi sẽ phải suy nghĩ $ a = 2 = 3 sẽ là một lỗi cú pháp biểu hiện hoặc giá trị trái lỗi yêu cầu hoặc như vậy ... Nó được đánh giá như thế nào? – sundar

+0

Bạn đúng Tôi sẽ sửa đổi nó là ($ a = 2) = 3 thay vì $ a = 2 = 3 – Pat

21

Chỉ cần để mở rộng câu trả lời trước ... Nếu vì bất cứ lý do gì, những nhiệm vụ cần phải là một phần của điều kiện, bạn muốn viết nó thusly:

$condition ? ($a=2) : ($a=3); 

Đây sẽ là hữu ích nếu bạn đang chỉ định cho các biến khác nhau dựa trên điều kiện.

$condition ? ($a=2) : ($b=3); 

Và nếu bạn đang lựa chọn các biến, nhưng gán điều tương tự không có vấn đề gì, thậm chí bạn có thể làm điều này:

($condition ? $a : $b) = 3; 
0

Một gợi ý để trả lời Tithonium của trên:

Nếu bạn muốn chỉ định các giá trị khác nhau cho cùng một biến, điều này có thể tốt hơn (cách sao chép):

$ a = ($ condition)? 2: 3;

40

Một khi bạn có một ý niệm mơ hồ mà bạn có thể mắc phải các vấn đề ưu tiên, một thủ thuật để tìm ra những gì Perl nghĩ bạn có nghĩa là:

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;' 

Trong trường hợp của bạn, mà sẽ chỉ cho bạn:

(($condition ? ($a = 2) : $a) = 3); 
print($a); 
-e syntax OK 

... tại thời điểm đó bạn nên nói "oh, điều đó giải thích"!

+0

Deparse là một thủ thuật rất gọn gàng. Tất nhiên, một khi bạn nghi ngờ một vấn đề ưu tiên, bạn thường là hầu hết các cách để giải pháp ;-) – RET

4

Do Perl điều hành ưu tiên tuyên bố đã được phân tích cú pháp như sau:

($condition ? $a = 2 : $a) = 3 ; 

Bởi vì: nhà điều hành sản xuất một kết quả có thể chuyển nhượng, 3 được gán cho là kết quả của tình trạng này.

Khi $ điều kiện là đúng điều này có nghĩa $ a = 2 = 3 hiến $ a = 3

Khi $ điều kiện là sai này có nghĩa là $ a = 3 hiến $ a = 3

Cách đúng để viết những dòng này là

$a = $condition ? 2 : 3; 

Nói chung, bạn thực sự cần thoát ra khỏi thói quen sử dụng các điều kiện để làm bài tập, như trong ví dụ ban đầu - đó là loại điều đó dẫn đến Perl nhận được một danh tiếng cho là ghi -chỉ có.

Nguyên tắc chung là các điều kiện chỉ dành cho các giá trị đơn giản, không bao giờ có biểu thức có phản ứng phụ. Khi bạn hoặc người khác cần đọc mã này tám tháng kể từ bây giờ, bạn có muốn đọc nó như thế này không?

$x < 3 ? foo($x) : bar($y); 

Hoặc như thế này?

if ($x < 3) { 
    $foo($x); 
} else { 
    $bar($y); 
}