En Perl, il existe plusieurs façons de parcourir des hachages : via each, via la liste des clés (keys) et foreach, ainsi que via values. Depuis le début du langage, il a été prévu que les hachages seraient utilisés pour un accès rapide aux données, donc les méthodes de parcours ont été créées en tenant compte de la performance et de la minimisation de l'allocation de mémoire supplémentaire.
Problème: Lors de l'utilisation de ces techniques, de nombreux pièges surviennent : modification du hachage pendant le parcours, mémorisation de l'itérateur, ordre des éléments, effet secondaire de each sur le hachage, ainsi que le risque de comportement inattendu lors de l'itération imbriquée.
Solution : Pour une itération sûre et prévisible, il est recommandé d'utiliser foreach my $key (sort keys %hash), de ne pas modifier le hachage pendant le parcours, et pour each — de toujours réinitialiser l'itérateur avec keys %hash avant un nouveau cycle.
Exemple de code :
my %hash = ( a => 1, b => 2, c => 3 ); foreach my $key (sort keys %hash) { print "$key: $hash{$key} "; # Ordre prévisible }
Caractéristiques clés :
keys renvoie une copie de la liste des clés, l'ordre n'est pas défini.each est mémorisé sur le hachage, plusieurs cycles en même temps ne sont possibles qu'avec différents hachages.each, un appel vide de keys est utilisé.Peut-on modifier le hachage en toute sécurité pendant l'itération via each ?
Non, cela entraîne des conséquences incontrôlables : des données peuvent être ignorées ou comptées plusieurs fois.
Si each est appelé pour deux hachages différents, l'itérateur sera-t-il commun ?
Non, les itérateurs sont indépendants pour chaque hachage.
Peut-on imbriquer deux boucles each pour le même hachage ?
Non, l'itérateur sera "déraillé" et les résultats seront imprévisibles. Pour de tels cas, utilisez keys et des boucles imbriquées.
Utilisation de each pour parcourir un hachage dans une fonction qui est appelée plusieurs fois avec différentes parties d'un même hachage. L'itérateur se dérègle, une partie des données est perdue.
Avantages :
Inconvénients :
Utilisation de foreach et keys pour un parcours complet, avec conservation explicite des clés dans un tableau séparé.
Avantages :
Inconvénients :