¿Cómo se puede hacer que Perl se detenga al hacer referencia a un valor indefinido?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

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

¿Fue útil?

Solución

use warnings FATAL => 'uninitialized';

use Carp ();
$SIG{__DIE__} = \&Carp::confess;

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

Otros consejos

En lugar de jugar desordenadamente con %SIG propuesto por todos los demás, solo use Carpa::Siempre y listo.

Tenga en cuenta que puede inyectar módulos en un script sin modificaciones del código fuente simplemente ejecutándolo con perl -MCarp::Always;además, puede configurar el PERL5OPT variable de entorno para -MCarp::Always para tenerlo cargado sin siquiera cambiar la invocación del script.(Ver perldoc perlrun.)

Incluye esto:

use Carp ();

Luego incluye uno de estas líneas en la parte superior de su archivo fuente:

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

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

Una forma de hacer que esas advertencias sean fatales es instalar un controlador de señales para el ADVERTIR señal virtual:

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

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

use Carp qw();

[....]

Carp::confess '$variableName is undef' unless defined $variableName;

[....]

Tienes que hacer esto manualmente.¡Las "respuestas" anteriores no funcionan!Sólo 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 provocó ningún mensaje de error ni advertencia.No conozco ninguna forma de hacer que Perl detecte automáticamente el uso de undef como referencia no válida.Sospecho que esto es así por diseño, para que la autovivificación funcione a la perfección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top