Como você pode obter o Perl parar ao fazer referência a um valor indefinido?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Como obter o Perl para parar e dar um rastreamento de pilha quando você faz referência a um valor indefinido, em vez de meramente aviso?Parece que use strict; não é suficiente para este propósito.

Foi útil?

Solução

use warnings FATAL => 'uninitialized';

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

A primeira linha faz com que o aviso fatal.Os próximos dois causar um rastreamento de pilha quando o seu programa morre.

Outras dicas

Em vez de o confuso mexer com %SIG proposta por qualquer pessoa, basta use Carpa::Sempre e ser feito.

Note que você pode injetar módulos em um script sem fonte modificações simplesmente executando-o com perl -MCarp::Always;além disso, você pode definir o PERL5OPT variável de ambiente -MCarp::Always tê-lo carregado, mesmo sem alterar a invocação do script.(Ver perldoc perlrun.)

Incluir este:

use Carp ();

Em seguida, incluir um estas linhas na parte superior do arquivo de origem:

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

O confess a linha vai dar um rastreamento de pilha, e o cluck a linha é muito mais concisa.

Uma maneira de fazer os avisos fatal é a instalação de um processador de sinal para o AVISAR virtual-sinal:

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

Fazer referência a um valor indefinido não seria um problema em si, mas pode causar advertências se o seu código está esperando para ser algo diferente do que undef.(especialmente se você está tentando usar essa variável como um objeto de referência).Você poderia colocar algo no seu código, tais como:

use Carp qw();

[....]

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

[....]

Você terá que fazer isso manualmente.Acima de "respostas" não funcionam!Apenas testar este:

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

Você vai ver que a referência não causar quaisquer avisos ou mensagens de erro.Eu sei de nenhuma forma, de causar Perl para automaticamente detectar o uso de undef como uma referência inválida.Eu suspeito que isto é assim, por predefinição, para que autovivification funciona perfeitamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top