2012-06-11 14 views
5

Il seguente codice funziona bene con Active Perl 5.14.2:Perl problema di incompatibilità con ciascuno in un hash di hash - 5.14 → 5.8.8

my %hzones =(); 
#%hzones= (
# 'zone1' => { 
#     'ns1' => 'ip1', 
#     'ns1' => 'ip2', 
#     }, 
# 'zone2' => { 
#     'ns1' => 'ip1', 
#     'ns2' => 'ip2' 
#     } 
#); 

foreach my $k1 (keys %hzones) { 
    debug("# $k1",$d); 
    while (my ($key, $value) = each($hzones{ $k1 })) { # Problem is here 217 
     while (my ($nsname, $nsip) = each(%$value)) { 
      debug("## $nsname , $nsip",$d); 
    } 
    # Creation de la zone et ajout dans infoblox 
    $session->add(createZone($k1)) or error("Add zone for ".$k1." failed: ", 
     $session->status_code(). ":" .$session->status_detail()); 
    } 
} 

Ora, se si tenta di utilizzare questo codice su RedHat 5.3 con Perl 5.8.8, ho il seguente errore:

Type of arg 1 to each must be hash (not hash element) at 
    ./migration-arpa.pl line 217, near "}) " 
Execution of ./migration-arpa.pl aborted due to compilation 
    errors. 

domanda: Come posso correggere questo errore? Come attraversare il mio hashtable?

+13

Perl 5.7 è una versione * antica * ** di sviluppo **. Non usarlo – Quentin

+2

Red Hat 5.3 è fornito con Perl 5.8.8 come standard (vedere http://vault.centos.org/5.3/os/i386/CentOS/). Se stai eseguendo 5.7 significa che qualcuno ha effettuato il downgrade della tua versione di Perl a una versione di sviluppo (per esempio instabile) di Perl. Davvero, non usarlo per nessun lavoro serio. –

+0

Ha detto che sta usando 5.8.8 nel post. L'oggetto deve essere un errore di battitura. Fisso. – ikegami

risposta

17

Che Quentin ha detto, ma si potrebbe provare a sostituire

each($hzones{ $k1 }) 

con

each(%{$hzones{ $k1 }}) 

che dereference il rif hash.

+9

Il supporto per la derefencing automatica degli hashrefs è stato [aggiunto in Perl 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements). – Quentin

3

La possibilità di passare un riferimento a each (each($hzones{ $k1 })) era introduced in 5.14.0. Prima di ciò, si doveva passare un hash (each(%{ $hzones{ $k1 })). Funziona ancora e continuerà a funzionare.

Così, per essere compatibile, usare

each(%{ $hzones{ $k1 }) 

invece di

each($hzones{ $k1 }) 

Nota: Passare un riferimento a each è contrassegnato come sperimentale, e lo considero buggy in quanto non è così lavorare con tutti gli hash.

+0

Se è sperimentale passare un riferimento a 'each', quale sarebbe l'alternativa migliore da usare senza' each'? – Yohann

+0

@Yohann, L'unica alternativa (mentre si usa ancora 'each') è passare un hash, come mostrato. – ikegami

+0

Ero molto eccitato per questo, e ora sono d'accordo, ci sono troppi casi strani. Cerco di non usarlo mai. Sfortunatamente ho accidentalmente dimenticato un dereferenziamento '%' prima di uno scalare una volta, il codice ha funzionato, quindi ho rilasciato ... e ho rotto tutto prima della 5.14. Oh bene, facilmente rimediabile, ma lezione imparata. –