Comment pouvez-vous faire en sorte que Perl arrête lors du référencement d'une valeur undef?
Question
Comment obtenez-vous Perl pour qu’il s’arrête et donne une trace de la pile lorsque vous référencez une valeur undef, plutôt que simplement en avertissant? Il semble que use strict;
ne suffit pas à cette fin.
La solution
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
La première ligne rend l'alerte fatale. Les deux suivants provoquent une trace de la pile lorsque votre programme meurt.
Autres conseils
Au lieu de jouer avec % SIG
proposé par tout le monde, il vous suffit de utiliser Carp :: Toujours
et que cela soit fait.
Notez que vous pouvez injecter des modules dans un script sans modification de source en l'exécutant simplement avec perl & nbsp; -MCarp :: Always
; De plus, vous pouvez définir la variable d'environnement PERL5OPT
sur -MCarp :: Always
pour qu'elle soit chargée sans même changer l'invocation du script. (Voir perldoc perlrun
.)
Inclure ceci:
use Carp ();
Ensuite, incluez une de ces lignes en haut de votre fichier source:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
La ligne confess
donnera une trace de pile, et la ligne cluck
est beaucoup plus concise.
Une façon de rendre ces avertissements fatals consiste à installer un gestionnaire de signaux pour le WARN signal virtuel:
$SIG{__WARN__} = sub { die "Undef value: @_" if Une façon de rendre ces avertissements fatals consiste à installer un gestionnaire de signaux pour le WARN signal virtuel:
<*>[0] =~ /undefined/ };
Référencer une valeur undef ne serait pas un problème en soi, mais cela pourrait provoquer des avertissements si votre code s’attend à ce qu’il soit autre chose que undef. (particulièrement si vous essayez d'utiliser cette variable comme référence d'objet). Vous pouvez mettre quelque chose dans votre code tel que:
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
Vous devez le faire manuellement. Ce qui précède " répond " ne fonctionnent pas! Il suffit de tester ceci:
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";
}
Vous constaterez que la déréférencement n'a provoqué aucun message d'erreur ni aucun avertissement. Je ne connais aucun moyen de faire en sorte que Perl détecte automatiquement l'utilisation de undef comme référence non valide. Je soupçonne que tel est le cas, de sorte que l'autovivification fonctionne de manière transparente.