Tôi đang sử dụng reval từ mô-đun Safe của Perl và tôi muốn ngăn chặn cảnh báo này nếu chuỗi không được phân tích cú pháp (thực ra, tôi muốn ngăn chặn nó tạo ra bất kỳ cảnh báo nào) ."không cảnh báo;" trong một khoang an toàn
Ví dụ, đoạn mã sau:
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
my $x = $cft->reval(') 1');
my $y = $cft->reval('2' );
say "x: $x";
say "y: $y";
kết quả trong:
Number found where operator expected at (eval 5) line 1, near ") 1"
(Missing operator before 1?)
Use of uninitialized value $x in concatenation (.) or string at ./test line 12.
x:
y: 2
Những gì tôi đang cố gắng để đạt được là phải có $ x = undef và $ y = 2, và không có cảnh báo. Tôi đã cố gắng đặt "không có cảnh báo"; bên trong một phạm vi mới, nhưng nó không ảnh hưởng đến những lời cảnh báo được sản xuất từ bên trong Reval (mặc dù, như đã chỉ ra bởi @DavidO, nó im lặng của các giá trị chưa được khởi tạo 'cảnh báo):
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
{
no warnings;
my $x = $cft->reval(') 1');
my $y = $cft->reval('2' );
say "x: $x";
say "y: $y";
}
Tôi đoán rằng bằng cách nào đó 'không có cảnh báo' phải ở trong ngăn An toàn, vì vậy tôi cũng đã cố gắng thêm "không có cảnh báo"; để các dây được eval'ed:
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
{
my $x = $cft->reval('no warnings;' . ') 1');
my $y = $cft->reval('no warnings;' . '2' );
say "x: $x";
say "y: $y";
}
cách Reval này không phát hành bất kỳ cảnh báo, nhưng cả hai biến là undef:
Use of uninitialized value $x in concatenation (.) or string at ./test line 10.
x:
Use of uninitialized value $y in concatenation (.) or string at ./test line 11.
y:
Tôi không biết những gì khác để thử, và tôi hy vọng mô tả sự cố đủ rõ ràng.
Lần thử thứ hai của bạn thực sự không tạo ra cùng một đầu ra như lần đầu tiên. Nó vẫn tạo ra lỗi "compiletime" (thực sự là lỗi compiletime reval), nhưng không phải là cảnh báo thời gian chạy liên quan đến nội suy một giá trị uninitialized trong câu lệnh 'say' của bạn. Vì vậy, bạn đã thực sự giải quyết được một nửa vấn đề của mình (lập lại cảnh báo) trong đoạn mã thứ hai ở trên. Nửa còn lại (làm sai lệch thời gian biên dịch) có vấn đề hơn. – DavidO
Vâng, bạn đúng về điều đó. Tôi thậm chí không nhận thấy rằng bởi vì mối quan tâm chính của tôi ở đây thực sự là vòng quay - cảnh báo biến không được khởi tạo là kết quả của việc tôi cố gắng giữ ví dụ ngắn gọn. Dù sao, tôi đã cập nhật các bài viết để làm cho nó rõ ràng hơn. Cảm ơn! – andrefs