102 votes

Quel est le moyen le plus sûr d'itérer parmi les clés d'un hachage Perl ?

Si j'ai un hachage Perl avec un tas de paires (clé, valeur), quelle est la méthode préférée pour itérer à travers toutes les clés ? J'ai entendu dire que l'utilisation de each peuvent d'une certaine manière avoir des effets secondaires involontaires. Alors, est-ce vrai, et l'une des deux méthodes suivantes est-elle la meilleure, ou existe-t-il un meilleur moyen ?

# Method 1
while (my ($key, $value) = each(%hash)) {
    # Something
}

# Method 2
foreach my $key (keys(%hash)) {
    # Something
}

3voto

jj33 Points 3858

Je vais peut-être me faire piquer par celui-ci mais je pense que c'est une préférence personnelle. Je ne trouve aucune référence dans la doc sur le fait que each() soit différent de keys() ou values() (autre que la réponse évidente "ils retournent des choses différentes". En fait, la documentation indique qu'ils utilisent le même itérateur et qu'ils renvoient tous des valeurs de liste réelles plutôt que des copies de celles-ci, et que modifier le hachage tout en itérant sur celui-ci en utilisant n'importe quel appel est mauvais.

Cela dit, j'utilise presque toujours keys() car, pour moi, il est généralement plus explicite d'accéder à la valeur de la clé via le hachage lui-même. J'utilise occasionnellement values() lorsque la valeur est une référence à une grande structure et que la clé du hachage était déjà stockée dans la structure, auquel cas la clé est redondante et je n'en ai pas besoin. Je pense que j'ai utilisé values() 2 fois en 10 ans de programmation Perl et c'était probablement le mauvais choix les deux fois =)

3voto

jaredg Points 1610

J'utilise également toujours la méthode 2. Le seul avantage d'utiliser les deux méthodes est que si vous lisez simplement (plutôt que de réassigner) la valeur de l'entrée de hachage, vous ne déréférencez pas constamment le hachage.

2voto

Gary Richardson Points 7371

J'utilise habituellement keys et je n'arrive pas à me souvenir de la dernière fois où j'ai utilisé ou lu une utilisation de each .

N'oubliez pas map en fonction de ce que vous faites dans la boucle !

map { print "$_ => $hash{$_}\n" } keys %hash;

0voto

dimas Points 41

J'ai eu le même message d'erreur Impossible de localiser la méthode d'objet "port" via le paquet "URI::_generic".

J'ai ajouté :

$uri->scheme('http');

Mon code :

my $uri = URI->new();
$uri->scheme('http');
$uri->host( 'my.example.com' );
$uri->port( '8080' );

0voto

Hafeez PK Points 10

Très vrai. J'ai eu des problèmes en utilisant les deux. J'ai fait la réinitialisation en utilisant "keys %hash ;" et tout a commencé à fonctionner correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X