Voici un code mis à jour, avec une explication ci-dessous:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %photo_details = (
'black_cat' => [
{'size' => '1600x1200', 'position' => -25},
{'size' => '1280x1024', 'position' => 25},
{'size' => '800x600', 'position' => 0},
],
'race_car' => [
{'size' => '1600x1200', 'position' => 10},
{'size' => '800x600', 'position' => 5},
],
);
print Dumper(%photo_details);
foreach my $name (keys %photo_details) {
foreach my $photo_detail (@{ $photo_details{$name} }) {
my $size = $photo_detail->{'size'};
my $position = $photo_detail->{'position'};
print Dumper($photo_details{$photo});
print ("size = $size, position = $position\n");
}
}
J'ai remplacé certaines de vos parenthèses carrées et accolades. En Perl, les crochets vous donnent une référence à un tableau anonyme, et les accolades indiquent une référence à un hachage anonyme. Ils sont appelés anonymes car il n'existe pas de nom de variable explicite pour le tableau ou le hachage anonyme. Comme les structures de données Perl vous obligent à stocker une référence à un hachage plutôt que le hachage réel, vous en avez besoin pour construire les références. Vous pouvez le faire en deux étapes comme ceci:
my @array = (1, 2, 3);
my $array_ref = \@array;
my %hash = ('one' => 1, 'two' => 2, 'three' => 3);
my $hash_ref = \%hash_ref;
Pour obtenir des données sur array_ref $ et hash_ref $, vous devez l'opérateur ->:
print $array_ref->[0], "\n";
print $hash_ref->{one}, "\n";
Vous n'avez pas besoin des citations à l'intérieur de {} en référençant une clé de hachage, bien que certaines personnes considèrent les guillemets sur une clé de hachage comme une bonne pratique.
J'ai ajouté un exemple d'itération sur l'ensemble de la structure de données à titre d'exemple plutôt que de simplement regarder une référence.Voici la première ligne:
foreach my $name (keys %photo_details) {
La méthode keys retourne toutes les clés dans un hachage, de sorte que vous pouvez les obtenir dans l'ordre. Les itère prochaine ligne sur tous les photo_detail hashrefs en% photo_details:
foreach my $photo_detail (@{ $photo_details{$photo} }) {
Les @{ $photo_details{$photo} }
les références d'la référence $photo_details{$photo}
dans un tableau, que vous pouvez parcourir avec foreach.
La dernière chose que j'ai ajouté est un appel à Data::Dumper, un module très utile distribué avec Perl qui imprime des structures de données pour vous. Ceci est très pratique lors de la construction de structures de données comme celle-ci, tout comme son cousin proche Data::Dumper::Simple. Ce module n'est malheureusement pas distribué avec Perl, mais je préfère sa sortie car elle inclut des noms de variables.
Pour plus d'informations sur la création de structures de données complexes à l'aide de références, consultez perlreftut.
Vous ne voulez pas dire '$ photo_details {$ name}'? – nodmonkey
Oui, merci d'avoir attrapé ça. C'est réparé maintenant. –
'my $ hash_ref = \% hash_ref;' - cela devrait être '\ hash'' – Richlv