Come si può ottenere il Perl per interrompere quando si fa riferimento a un valore undef?
Domanda
Come si ottiene il Perl di fermarsi e dare una traccia dello stack quando si fa riferimento a un valore undef, piuttosto che semplicemente di avviso?Sembra che use strict;
non è sufficiente per questo scopo.
Soluzione
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
La prima riga rende avviso fatale.I prossimi due provocare una traccia dello stack quando il programma muore.
Altri suggerimenti
Invece di giocherellare con disordinata %SIG
proposto da tutti gli altri, solo use Carpa::Sempre
e il gioco è fatto.
Si noti che è possibile inserire i moduli in una sceneggiatura senza fonte modifiche semplicemente eseguendo con perl -MCarp::Always
;inoltre, è possibile impostare il PERL5OPT
la variabile di ambiente -MCarp::Always
per averlo caricato senza nemmeno cambiare l'invocazione dello script.(Vedere perldoc perlrun
.)
Includere questo:
use Carp ();
Quindi includere uno di queste righe all'inizio del file di origine:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
Il confess
linea darà una traccia dello stack, e il cluck
la linea è molto più conciso.
Un modo per rendere questi avvertimenti fatale è quello di installare un gestore di segnale per il AVVERTIRE virtuale-segnale:
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
Il riferimento a un valore undef non sarebbe un problema in sé, ma può causare avvertenze se il tuo codice è previsto per essere qualcosa di diverso da undef.(in particolare se si sta cercando di utilizzare tale variabile come un riferimento a un oggetto).Si potrebbe mettere qualcosa nel codice come:
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
È necessario eseguire questa operazione manualmente.Al di sopra di "risposte" che non funzionano!Basta provare questo:
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";
}
Vedrete che la risoluzione del riferimento non causare eventuali messaggi di errore o avvisi.Non conosco nessun modo di causare Perl per rilevare automaticamente l'uso di undef come un riferimento non valido.Ho il sospetto che questo è in modo da disegno, in modo che autovivification funziona perfettamente.