perl warnings undef

¿Cómo puedes hacer que Perl se detenga al hacer referencia a un valor undef?



warnings (6)

En lugar del juego sucio con %SIG propuesto por todos los demás, simplemente use Carp::Always y listo.

Tenga en cuenta que puede inyectar módulos en una secuencia de comandos sin modificaciones de origen simplemente ejecutando con perl -MCarp::Always ; Además, puede establecer la variable de entorno PERL5OPT en -MCarp::Always para que se cargue sin cambiar la invocación del script. (Ver perldoc perlrun .)

¿Cómo logras que Perl se detenga y proporcione un seguimiento de la pila cuando haces referencia a un valor undef, en lugar de simplemente advertir? Parece que el use strict; no es suficiente para este propósito.


Hacer referencia a un valor undef no sería un problema en sí mismo, pero puede causar advertencias si su código espera que sea algo distinto de undef. (especialmente si intenta usar esa variable como referencia de objeto). Podrías poner algo en tu código tal como:

use Carp qw(); [....] Carp::confess ''$variableName is undef'' unless defined $variableName; [....]


Una forma de hacer que esas advertencias sean fatales es instalar un controlador de señal para la señal virtual WARN :

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


use warnings FATAL => ''uninitialized''; use Carp (); $SIG{__DIE__} = /&Carp::confess;

La primera línea hace que la advertencia sea fatal. Los siguientes dos causan un seguimiento de pila cuando su programa muere.


Incluye esto:

use Carp ();

Luego incluya una de estas líneas en la parte superior de su archivo fuente:

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

La línea confess dará un rastro de pila, y la línea cluck es mucho más concisa.


Tienes que hacer esto manualmente. ¡Las "respuestas" anteriores no funcionan! Solo prueba esto:

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

Verá que la desreferenciación no generó ningún mensaje de error o advertencia. No conozco ninguna forma de causar que Perl detecte automáticamente el uso de undef como referencia no válida. Sospecho que esto es así por diseño, por lo que la autovibulación funciona a la perfección.