Comment pouvez-vous faire en sorte que Perl arrête lors du référencement d'une valeur undef?

StackOverflow https://stackoverflow.com/questions/77954

  •  09-06-2019
  •  | 
  •  

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top