2012-06-11 11 views
5

El siguiente código funciona bien con Active Perl 5.14.2:problema de incompatibilidad Perl con cada uno en un hash de hashes - 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()); 
    } 
} 

Ahora, si trato de utilizar este código en RedHat 5.3 con Perl 5.8.8, tengo el siguiente error:

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. 

pregunta: ¿Cómo puedo solucionar este error? ¿Cómo atravieso mi hashtable?

+13

Perl 5.7 es una versión * ancient * ** development **. No lo uses – Quentin

+2

Red Hat 5.3 viene con Perl 5.8.8 como estándar (ver http://vault.centos.org/5.3/os/i386/CentOS/). Si está ejecutando 5.7, eso significa que alguien ha degradado su versión de Perl a una versión de desarrollo (es decir, inestable) de Perl. Realmente, no lo use para ningún trabajo serio. –

+0

Dijo que está usando 5.8.8 en la publicación. El sujeto debe ser un error tipográfico. Fijo. – ikegami

Respuesta

17

Lo dijo Quentin, pero se puede intentar sustituir

each($hzones{ $k1 }) 

con

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

cual elimina referencia a que el árbitro hash.

+9

Se ha agregado soporte para la eliminación automática de hashrefs [se ha agregado en Perl 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements). – Quentin

3

La capacidad de hacer pasar una referencia a each (each($hzones{ $k1 })) era introduced en 5.14.0. Antes de eso, uno tenía que pasar un hash (each(%{ $hzones{ $k1 })). Eso todavía funciona, y continuará funcionando.

Así que, para ser compatible con versiones anteriores, utilice

each(%{ $hzones{ $k1 }) 

en lugar de

each($hzones{ $k1 }) 

Nota: Al pasar una referencia a each está marcado como experimental, y considero que es buggy, ya que no hace trabajar con todos los hash

+0

Si es experimental pasar una referencia a 'cada', ¿cuál sería la mejor alternativa para usar sin' cada'? – Yohann

+0

@Yohann, la única alternativa (mientras se usa 'each') es pasar un hash, como se muestra. – ikegami

+0

Estaba muy emocionado al respecto, y ahora estoy de acuerdo, hay demasiados casos extraños. Intento nunca usarlo. Lamentablemente, olvidé accidentalmente una desreferenciación '%' antes de un escalar una vez, el código funcionó, así que lo liberé ... y rompí todo antes de 5.14. Oh, bueno, se remedia fácilmente, pero se aprendió la lección. –

Cuestiones relacionadas