2008-09-16 28 views

Trả lời

19
use warnings FATAL => 'uninitialized'; 

use Carp(); 
$SIG{__DIE__} = \&Carp::confess; 

Dòng đầu tiên làm cho cảnh báo gây tử vong. Hai phần tiếp theo gây ra một dấu vết ngăn xếp khi chương trình của bạn chết.

+0

Thay thế cho hai dòng cuối cùng, 'sử dụng Cá chép :: Luôn luôn'. –

4

Bao gồm này:

use Carp(); 

Sau đó, bao gồm một của những dòng này ở phía trên cùng của tập tin nguồn của bạn:

local $SIG{__WARN__} = \&Carp::confess; 
local $SIG{__WARN__} = \&Carp::cluck; 

Dòng confess sẽ cung cấp cho một chồng dấu vết, và cluck dòng là nhiều hơn nữa.

1

Tham chiếu giá trị không xác định sẽ không phải là vấn đề trong chính nó, nhưng nó có thể gây ra cảnh báo nếu mã của bạn đang chờ nó trở thành thứ khác không phải là undef. (đặc biệt nếu bạn đang cố sử dụng biến đó làm tham chiếu đối tượng). Bạn có thể đặt một cái gì đó trong mã của bạn như:

use Carp qw(); 

[....] 

Carp::confess '$variableName is undef' unless defined $variableName; 

[....] 
1

Một cách để làm cho những cảnh báo gây tử vong là cài đặt một handler tín hiệu cho WARN ảo tín hiệu:

$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ }; 
15

Thay vì lộn xộn nghịch ngợm với %SIG được đề xuất bởi những người khác, chỉ cần use Carp::Always và được thực hiện.

Lưu ý rằng bạn có thể chèn mô-đun vào một tập lệnh mà không cần sửa đổi nguồn đơn giản bằng cách chạy nó với perl -MCarp::Always; hơn nữa, bạn có thể đặt biến môi trường PERL5OPT thành -MCarp::Always để biến nó mà không cần thay đổi lời gọi của tập lệnh. (Xem perldoc perlrun.)

0

Bạn phải thực hiện việc này theo cách thủ công. Các "câu trả lời" ở trên không hoạt động! Chỉ cần kiểm tra điều này:

use strict; 
use warnings FATAL => 'uninitialized'; 
use Carp(); 
$SIG{__DIE__} = \&Carp::confess; 

my $x = undef; # it would be enough to say my $x; 
if (!$x->{test}) { 
print "no warnings, no errors\n"; 
} 

Bạn sẽ thấy rằng dereferencing không gây ra bất kỳ thông báo lỗi hoặc cảnh báo nào. Tôi biết không có cách nào gây ra Perl để tự động phát hiện việc sử dụng undef như một tham chiếu không hợp lệ. Tôi nghi ngờ điều này là như vậy bởi thiết kế, để autovivification hoạt động liền mạch.

+0

một băm rỗng sản xuất 0. Điều này dường như là một trường hợp đặc biệt. – marinara

Các vấn đề liên quan