Supponiamo di avere un'applicazione ENORME "develoopped";) da parte di una grande squadra. Ecco un modello semplificato del potenziale disastro che può verificarsi quando qualcuno controlla troppo in profondità in una struttura dati. Se non è possibile disabilitare completamente l'autovificazione o nell'ambito, come aggirare questo problema? Grazie mille :) !!!!Come disabilitare l'autovivificazione in Perl?
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);
Emette i seguenti:
$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
}
};
Sì so che c'è un avvertimento, ma ... potrebbe essere troppo tardi.
Hey ragazzi potrebbe essere d'aiuto dire che il mio hashref fa riferimento a un HASH legato.
Può essere se implemento un buon metodo FETCH che controlla i controlli più in profondità nella struttura, risolverò facilmente il mio problema?
ho guardato Tie::StrictHash, Tie::Hash e perltie. versione Qui è semplificata della mia soluzione:
#!/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 '.$/;
}
quello che ho fatto è quello di toccare un solo posto in app. Ora tutti i Luoghi come if ($ some_ref -> {deep} {doot}) causeranno la morte con stack-trace. Quindi li troverò facilmente e li correggerò. E nuovi scritti di questo tipo NON saranno possibili. Perl va bene anche per le grandi app, devi solo saperne di più;).
Grazie a tutti! Spero che questo aiuti anche gli altri.
qual è la tua domanda? –
Come disabilitare l'autovivificazione in perl? –