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?
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 }
)
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) {
...
}
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.
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é.