문제

undef 값을 참조할 때 단순한 경고가 아닌 Perl을 중지하고 스택 추적을 제공하려면 어떻게 해야 합니까?것 같다 use strict; 이 목적으로는 충분하지 않습니다.

도움이 되었습니까?

해결책

use warnings FATAL => 'uninitialized';

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

첫 번째 줄은 경고를 치명적으로 만듭니다.다음 두 개는 프로그램이 종료될 때 스택 추적을 발생시킵니다.

다른 팁

복잡하게 만지작거리는 것보다 %SIG 다른 사람들이 제안한 것, 그냥 use 잉어::항상 그리고 끝났어.

다음과 같이 실행하면 소스 수정 없이 스크립트에 모듈을 삽입할 수 있습니다. perl -MCarp::Always;게다가, 당신은 PERL5OPT 환경 변수 -MCarp::Always 스크립트 호출을 변경하지 않고도 로드할 수 있습니다.(보다 perldoc perlrun.)

다음을 포함하세요:

use Carp ();

그런 다음 포함 하나 소스 파일 상단에 다음 줄 중 하나가 있습니다.

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

그만큼 confess 줄은 스택 추적을 제공하고 cluck 줄이 훨씬 더 간결해졌습니다.

이러한 경고를 치명적으로 만드는 한 가지 방법은 신호 처리기를 설치하는 것입니다. 경고하다 가상 신호:

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

undef 값을 참조하는 것 자체는 문제가 되지 않지만, 코드에서 undef가 아닌 값을 참조하는 경우 경고가 발생할 수 있습니다.(특히 해당 변수를 개체 참조로 사용하려는 경우)코드에 다음과 같은 내용을 넣을 수 있습니다.

use Carp qw();

[....]

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

[....]

이 작업은 수동으로 수행해야 합니다.위의 "답변"은 작동하지 않습니다!이것을 테스트해보세요:

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";
}

역참조로 인해 오류 메시지나 경고가 발생하지 않았음을 알 수 있습니다.나는 Perl이 undef의 사용을 유효하지 않은 참조로 자동으로 감지하도록 하는 방법을 알지 못합니다.나는 이것이 의도적으로 그렇게 되어 자동생성이 원활하게 작동한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top