Come si può ottenere il Perl per interrompere quando si fa riferimento a un valore undef?

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

  •  09-06-2019
  •  | 
  •  

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top