Với mã:Perl quyết định thứ tự nào để đánh giá các thuật ngữ trong một biểu thức?
my $x = 1;
$x = $x * 5 * ($x += 5);
Tôi mong chờ $x
là 180
:
$x = $x * 5 * ($x += 5); #$x = 1
$x = $x * 5 * 6; #$x = 6
$x = 30 * 6;
$x = 180;
180;
Nhưng thay vào đó là 30
; tuy nhiên, nếu tôi thay đổi thứ tự các điều khoản:
$x = ($x += 5) * $x * 5;
Tôi nhận được 180
. Lý do tôi bối rối là perldoc perlop
nói rất rõ ràng:
TERM có quyền ưu tiên cao nhất trong Perl. Chúng bao gồm các biến, các toán tử báo giá và trích dẫn tương tự, bất kỳ biểu thức nào trong dấu ngoặc đơn và bất kỳ hàm nào có đối số được đặt dấu ngoặc đơn.
Vì trong ngoặc đơn, nó phải là một thuật ngữ và do đó được thực hiện trước, bất kể thứ tự của biểu thức.
Bạn biết đấy, khi đã học C trước tiên, tôi không bao giờ làm những việc như thế này và mong đợi nó hoạt động theo cách tôi nghĩ rằng nó phải hoạt động: http://c-faq.com/expr/index.html ;-) –
Tôi cũng đến từ ANSI C, và yeah, đây không phải là mã tôi sẽ viết, đó là tôi cố gắng để đảm bảo rằng tôi hiểu ưu tiên trong Perl trước khi tôi giải thích nó cho người khác. Sử dụng các tác dụng phụ như thế này là một không-không lớn, nhưng vẫn hợp pháp trong Perl. Trong ANSI C, nếu bạn có nhiều hơn một tác dụng phụ trong một biểu thức kết quả là không xác định, trong tác dụng phụ Perl được xác định tốt hơn, nhưng vẫn là một ý tưởng thực sự xấu. –
Tôi đã từng tạo một bài đăng đáng yêu về việc này lên comp.lang.perl.misc và chưa bao giờ có thể tìm lại nó. –