Como desativo a ativação automática em Per

Suponha que você tenha uma aplicação ENORME "desenvolvida";) por uma grande equipe. Aqui está um modelo simplificado do desastre em potencial que pode ocorrer quando alguém verifica profundamente em uma estrutura de dados. Se não for possível desativar a autovificação completamente ou no escopo, como contornar isso? Muito obrigado :) !!!

use strict; use warnings;use Data::Dumper;

my $some_ref = {akey=>{deeper=>1}};
print Dumper($some_ref );
if($some_ref->{deep}{doot} == 1){
    print 'too deep '.$/;
}

if($some_ref->{deep}){
    print 'Already in a deep doot'.$/;
}

print Dumper($some_ref );

Isso gera o seguinte:

$VAR1 = {
          'akey' => {
                      'deeper' => 1
                    }
        };
Use of uninitialized value in numeric eq (==) at autovivify_test.pl line 5.
Already in a deep doot
$VAR1 = {
          'deep' => {},
          'akey' => {
                      'deeper' => 1
                    }
        };

im, eu sei que há um aviso, mas ... pode ser tarde demai

Hey pessoal, pode ser útil dizer que meu hashref faz referência a um HASH vinculad

Pode implementar um bom método FETCH que verifique verificações mais profundas na estrutura, resolvendo facilmente meu problem

Eu olhei paraTie :: StrictHash,Tie :: Hash e perltie. Aqui está a versão simplificada da minha solução:

#!/usr/bin/env perl;
#test_tie.pl

package StrictHash;
use strict; use warnings;
use Tie::Hash;
our @ISA = qw(Tie::StdHash);
use Carp;

sub TIEHASH {
    my $class = shift;
    my $hash = bless {@_}, $class;
    return $hash;
}
##========================================================================
## FETCH fails if applied to a member that doesn't exist.
##========================================================================
sub FETCH {
    my ($hash, $key) = @_;
    Carp::confess "key '$key' does not exist" unless exists $hash->{$key};
    return $hash->{$key};
}
##========================================================================
package main;
use strict;use warnings;use Data::Dumper;
#Imagine StrictHash is in ./StrictHash.pm
#use StrictHash;
my %hash;
tie %hash, 'StrictHash', akey => {deeper=>1} ;  

my $some_ref =\%hash;
print Dumper($some_ref );
if($some_ref->{deep}{doot} == 1){
    print 'too deep '.$/;
}

O que consegui é tocar apenas em um lugar no aplicativo. Agora todos os lugares como if ($ some_ref -> {deep} {doot}) causarão dados com rastreamento de pilha. Então, eu os encontrarei e os corrigirei facilmente. E novos escritos desse tipo NÃO serão possíveis. Perl também é bom para aplicativos grandes, você só precisa saber mais;).

Obrigado a todos! Espero que isso ajude outras pessoas também.

questionAnswers(5)

yourAnswerToTheQuestion