Cần có những thay đổi nào, nếu có, để thực hiện bằng chứng đánh giá Perl eval sau đây?
Nếu tôi nhớ chính xác, nếu bạn quan tâm đến nội dung của $ @ (và không chỉ cho dù đó là sự thật hay không), bạn cũng cần phải bảo vệ chống lại $ @ bị ghi đè bởi mã khác chết trước khi bạn xem nó (xem câu trả lời cho 1. dưới đây).
- Kiểu sau bảo vệ chống $ @ không được đặt chính xác?
Vâng, $ @ có thể được ghi đè trong thời gian giữa eval
và if
. Trường hợp phổ biến nhất cho điều này, nếu tôi nhớ chính xác, là phương thức DELETE của một đối tượng không nằm trong phạm vi (vì nó nằm trong eval) bằng cách sử dụng thành công eval
.
"1;" sau đây là gì? bảo vệ chống lại?
Giá trị thực sự không đổi (không nhất thiết phải là 1) để đảm bảo rằng khối eval
trả về giá trị thực. Nếu mã trong khối chết, thì khối sẽ trả về một chuỗi rỗng và khối do
sẽ chạy.Nếu bạn chắc chắn rằng câu lệnh cuối cùng trong khối sẽ luôn đúng, thì điều đó là không cần thiết; tuy nhiên, không có lý do gì để không chỉ chắc chắn với giá trị không đổi.
Là "hoặc làm {" tốt hơn câu "if ($ @) {"? Nếu vậy, tại sao?
Nó tránh phải lưu trữ giá trị trả về của khối eval
. Bạn có thể nói
my $result = eval {
#do stuff
1;
};
unless ($result) {
# handle error
}
Nguồn
2013-05-23 12:11:11
Cách dễ nhất để xử lý lỗi chống đạn bằng khối eval là sử dụng mô-đun thực hiện cú pháp thử-bắt, ví dụ: [Thử :: Tiny] (https://metacpan.org/module/DOY/Try-Tiny-0.12/lib/Try/Tiny.pm). – amon
Đây rõ ràng là kết quả của một người áp dụng [khuyến cáo của Perl :: Critic] (http://p3rl.org/Perl::Critic::Policy::ErrorHandling :: RequireCheckingReturnValueOfEval). – daxim
@daxim Điều đó thường không phải là một điều xấu :) – nslntmnx