Frage

Wie Sie Perl bekommen zu stoppen und einen Stack-Trace zu geben, wenn Sie einen Wert undef verweisen, anstatt nur warnen? Es scheint, dass use strict; für diesen Zweck nicht ausreichend ist.

War es hilfreich?

Lösung

use warnings FATAL => 'uninitialized';

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

Die erste Zeile macht die Warnung tödlich. Die nächsten zwei Ursachen ein Stack-Trace, wenn Ihr Programm stirbt.

Andere Tipps

Statt das chaotisch mit %SIG Hantieren von jedermann vorgeschlagen anderem, nur use Carp::Always und durchgeführt werden.

Beachten Sie, dass Sie Module in ein Skript ohne Quellen Modifikationen einfach indem sie sie mit perl -MCarp::Always läuft injizieren kann; Des Weiteren können Sie die PERL5OPT Umgebungsvariable auf -MCarp::Always setzen es sogar ohne Änderung der Aufruf des Skripts geladen zu haben. (Siehe perldoc perlrun .)

Fügen Sie diese:

use Carp ();

Dann sind ein diese Zeilen am Anfang der Quelldatei:

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

Die confess Linie wird ein Stack-Trace geben, und die cluck Linie ist viel mehr lapidar.

Eine Möglichkeit, diese Warnungen fatal zu machen, ist ein Signal-Handler für das WARN virtual-Signal zu installieren:

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

würde ein undef Wert Referenzierung kein Problem an sich sein, aber es kann Warnungen verursachen, wenn Ihr Code erwartet, dass es etwas anderes als undef zu sein. (Vor allem, wenn Sie versuchen, diese Variable als Objekt Referenz zu verwenden). Sie könnten etwas in Ihrem Code setzen, wie:

use Carp qw();

[....]

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

[....]

Sie müssen dies manuell tun. Die oben genannten „Antworten“ funktionieren nicht! Testen Sie einfach dies:

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

Sie werden sehen, dass dereferencing keine Fehlermeldungen oder Warnungen nicht verursacht. Ich kenne keine Möglichkeit der Verursachung Perl automatisch die Verwendung von undef als eine ungültige Referenz zu erfassen. Ich vermute, dass dies so ist konstruktionsbedingt, so dass autovivification arbeitet nahtlos.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top