Làm thế nào để bạn có được Perl dừng lại và đưa ra một dấu vết ngăn xếp khi bạn tham khảo một giá trị undef, chứ không chỉ đơn thuần là cảnh báo? Có vẻ như use strict;
không đủ cho mục đích này.Làm cách nào để bạn có thể nhận được Perl dừng khi tham chiếu giá trị không xác định?
Trả lời
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.
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.
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;
[....]
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/ };
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
.)
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.
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
- 1. Làm cách nào tôi có thể tham chiếu đến giá trị băm cụ thể trong Perl?
- 2. Làm cách nào để xác định loại tham chiếu được ưu tiên trong Perl?
- 3. được cung cấp/khi có giá trị không xác định
- 4. Làm cách nào để kiểm tra xem biến có được xác định trước khi tham chiếu không?
- 5. Làm cách nào để bạn đặt giá trị kép thành "không có giá trị"
- 6. Xác minh giá trị tham số tham chiếu với Moq
- 7. không thể sử dụng giá trị không xác định làm biểu tượng perl
- 8. Làm cách nào để xác định xem một băm Perl có chứa ánh xạ khóa tới giá trị không xác định?
- 9. Làm thế nào để nhận được giá trị từ đối tượng, với giá trị mặc định
- 10. Bạn có nên xác định giá trị null/không xác định cho các enums Java không?
- 11. Python: Khi nào một biến được truyền theo tham chiếu và khi nào theo giá trị?
- 12. cách nhận giá trị POST trong perl
- 13. Làm thế nào để bạn có thể lập trình xác định số tham chiếu đến một phương thức với C#
- 14. Tham chiếu không bắt buộcLỗi: cordova không được xác định
- 15. Perl, nhận tất cả giá trị băm
- 16. Làm thế nào để bạn chỉ định 'DEFAULT' làm giá trị tham số SQL trong ADO.NET?
- 17. Hàm băm Perl khi cả khóa và giá trị là tham chiếu mảng
- 18. SQL làm cách nào để bạn truy vấn các bảng tham chiếu đến một giá trị khóa ngoài cụ thể?
- 19. Lỗi "Tham chiếu đến hàm" không được xác định
- 20. Tham chiếu không bắt buộcLỗi: django không được xác định
- 21. Chỉ định giá trị mặc định cho loại tham chiếu
- 22. Không nên bỏ qua xác thực khi không có giá trị nào được chỉ định?
- 23. Gurobi python nhận giá trị của biến được xác định
- 24. Bạn có thể buộc tham số vô hướng hoặc mảng là một mảng trong Perl không?
- 25. không xác định tham chiếu đến `stdscr '
- 26. Làm cách nào để xác định liệu giá trị tham số PowerShell Cmdlet đã được chỉ định?
- 27. Tham chiếu không bắt buộcLỗi: google không được xác định
- 28. Làm cách nào để sửa tham chiếu không xác định thành _imp __ *?
- 29. Python ctypes không trả lại chính xác một số giá trị được chuyển bởi tham chiếu
- 30. Làm thế nào tôi có thể nhận được giá trị tham số ngữ cảnh trong jsp.?
Thay thế cho hai dòng cuối cùng, 'sử dụng Cá chép :: Luôn luôn'. –