2016-03-01 2 views
0

J'ai écrit la routine ci-dessous, pour parcourir les hachages 0 - 7 et imprimer la valeur d'une clé spécifique dans chacun. Je dois saisir la valeur de 'b4' dans chaque hash.Itérer à travers un tableau de hachages

Je voudrais supprimer le (0..7), avec quelque chose de plus intelligent quand il y a différents nombres de hachages. Par exemple, parfois il n'y a que 2 ou il peut y avoir 160.

my $out = decode_json $client->responseContent(); 

#print "\nOutput is :\n\n" . Dumper $out; 
for my $slice (0..7) { 
    my $out = $out->{data}[$slice]{b4}; 
    print " $out \n"; 
} 

Les données sont structurées en tant que tel:

DB<1> x $out 
0 HASH(0x125fb5e0) 
    'data' => ARRAY(0x1260d760) 
     0 HASH(0x121765d0) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     1 HASH(0x125fb650) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     2 HASH(0x1236b960) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     3 HASH(0x12177030) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     4 HASH(0x1260da00) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
+1

[perldsc] (http: // perldoc. perl.org/perldsc.html) (le livre de recettes des structures de données Perl) pourrait être utile. Il montre comment créer et itérer à travers différentes structures de données, comme des tableaux de hachages. – ThisSuitIsBlackNot

Répondre

3

Votre $out est une référence à un hachage à élément unique qui a une référence de groupe pour la valeur de son élément data

Il est préférable d'extraire la référence dans une variable distincte afin que vous puissiez accéder au contenu plus simplement. Supposons que vous avez écrit

my $data = $out->{data}; 

Par la suite, le tableau est accessible @$data, le nombre d'éléments qu'il contient est scalar @$data, et les indices sont 0 .. $#$data. Vous pouvez accéder à chaque élément du tableau avec $data->[0], $data->[1] etc.

Votre code serait

my $out = decode_json $client->responseContent; 
my $data = $out->{data}; 

for my $i (0 .. $#$data) { 
    my $item = $data->[$i]; 
    my $b4 = $item->{b4}; 
    print "$b4\n"; 
} 

Mais notez que, à moins que vous avez besoin de l'index de tableau pour d'autres fins, vous êtes probablement mieux itérer les éléments du tableau eux-mêmes plutôt que ses indices. Ce code ferait la même chose

my $out = decode_json $client->responseContent; 
my $data = $out->{data}; 

for my $item (@$data) { 
    my $b4 = $item->{b4}; 
    print "$b4\n"; 
} 

Ou même juste

print "$_->{b4}\n" for @$data; 

si vous n'avez pas besoin de faire quoi que ce soit d'autre au sein de votre boucle

+0

Incroyable et merci pour l'explication! – lollan

0

Voici comment itérer sur le tableau

for my $cur (@{$out->{data}}) 
{ 
    ... 
} 
+0

'$ out -> {data}' est une référence de liste, pas une référence de hachage. – mob

+0

Ouais, j'ai manqué ça à l'origine. Réponse fixée. Notez le titre est incorrect, que je vais corriger. –

+2

@mob: Il n'existe pas de référence de liste. '$ out -> {data}' est une référence de tableau – Borodin