web-dev-qa-db-fra.com

Comment utiliser foreach avec une référence de hachage?

J'ai ce code

foreach my $key (keys %ad_grp) {

    # Do something
}

qui fonctionne.

À quoi ressemblerait la même chose si je n'ai pas %ad_grp, mais une référence, $ad_grp_ref, au hachage?

25
foreach my $key (keys %$ad_grp_ref) {
    ...
}

Perl::Critic Et daxim recommandent le style

foreach my $key (keys %{ $ad_grp_ref }) {
    ...
}

par souci de lisibilité et de maintenance (pour que vous n'ayez pas à réfléchir sérieusement à ce que vous devez changer lorsque vous devez utiliser %{ $ad_grp_obj[3]->get_ref() } au lieu de %{ $ad_grp_ref })

58
mob

En Perl 5.14 (il fonctionne maintenant en Perl 5.13), nous pourrons simplement tiliser les clés sur la référence de hachage

use v5.13.7;

foreach my $key (keys $ad_grp_ref) {
    ...
}
8
oylenshpeegul

Comme d'autres l'ont dit, vous devez déréférencer la référence. La fonction keys nécessite que son argument commence par un % :

Ma préférence:

foreach my $key (keys %{$ad_grp_ref}) {

Selon Conway :

foreach my $key (keys %{ $ad_grp_ref }) {

Devinez qui vous devriez écouter ...

Vous voudrez peut-être lire la Documentation de référence Perl .

Si vous vous retrouvez à faire beaucoup de choses avec des références à des hachages et des hachages de listes et de listes de hachages, vous voudrez peut-être commencer à penser à utiliser Perl orienté objet . Il y a beaucoup de jolis petits tutoriels dans la documentation Perl.

5
David W.

Donc, avec Perl 5.20, la nouvelle réponse est:

foreach my $key (keys $ad_grp_ref->%*) {

(qui a l'avantage de travailler de manière transparente avec des expressions plus compliquées:

foreach my $key (keys $ad_grp_obj[3]->get_ref()->%*) {

etc.)

Voir perlref pour la documentation complète.

Remarque: dans Perl version 5.20 et 5.22, cette syntaxe est considérée comme expérimentale, vous devez donc

use feature 'postderef';
no warnings 'experimental::postderef';

en haut de tout fichier qui l'utilise. Perl 5.24 et versions ultérieures ne nécessitent aucun pragmas pour cette fonctionnalité.

2
Jonathan Cast