En Perl hay varias formas de recorrer hashes: a través de each, a través de la lista de claves (keys) y foreach, así como a través de values. Desde el principio del lenguaje se supone que los hashes se utilizarán para un acceso rápido a los datos, por lo que los métodos de iteración se crearon teniendo en cuenta el rendimiento y la minimización de la asignación de memoria adicional.
Problema: Al usar estas técnicas surgen muchas trampas: modificar el hash durante la iteración, recordar el iterador, el orden de los elementos, la influencia secundaria de each en el hash y el riesgo de un comportamiento inesperado en la iteración anidada.
Solución: Para una iteración segura y predecible se recomienda usar foreach my $key (sort keys %hash), no modificar el hash durante la iteración y para each — siempre restablecer el iterador utilizando keys %hash antes de un nuevo ciclo.
Ejemplo de código:
my %hash = ( a => 1, b => 2, c => 3 ); foreach my $key (sort keys %hash) { print "$key: $hash{$key} "; # Orden predecible }
Características clave:
keys devuelve una copia de la lista de claves, el orden no está definido.each se recuerda en el hash, varios ciclos simultáneamente son posibles solo con diferentes hashes.each se utiliza una llamada vacía a keys.¿Se puede modificar el hash de forma segura durante la iteración con each?
No, esto conduce a consecuencias incontrolables: los datos pueden ser omitidos o contados varias veces.
Si se llama a each para dos hashes diferentes, ¿habrá un iterador compartido?
No, los iteradores son independientes para cada hash.
¿Se pueden anidar dos ciclos de each para el mismo hash?
No, el iterador se "descalibrará" y los resultados serán impredecibles. Para tales casos, use keys y ciclos anidados.
Uso de each para recorrer un hash en una función que se llama repetidamente con diferentes partes del mismo hash. El iterador se descalibra, parte de los datos se pierde.
Pros:
Contras:
Uso de foreach y keys para la iteración, recorrido completo con el guardado explícito de claves en un array separado.
Pros:
Contras: