2010-09-24 11 views
3

J'ai un tableau de hachage, chaque hachage contenant les mêmes clés mais les valeurs sont uniques. Sur la base d'une valeur particulière, je dois stocker hash ref.Comment puis-je récupérer un hash ref d'un tableau de hachages par l'une de ses valeurs?

Voir l'exemple ci-dessous pour comprendre correctement:

my @aoaoh = (
      { a => 1, b => 2 }, 
      { a => 3, b => 4 }, 
      { a => 101, b => 102 }, 
      { a => 103, b => 104 }, 
    ); 

Maintenant, je vais vérifier si une clé de hachage a contient une valeur 101. Si oui alors j'ai besoin de stocker le ref.

Comment faire?

+3

Vous pouvez avoir une idée de thread à http://stackoverflow.com/questions/934225/search-for-hash-in-an-array-by-value – ppant

+0

@ppant: merci, le lien est également utile. –

Répondre

14
my $key = "a"; 
my ($ref) = grep { $_->{$key} == 101 } @aoaoh; 

ou en utilisant List::Util « s first():

use List::Util 'first'; 
my $ref = first { $_->{$key} == 101 } @aoaoh; 
+0

Ou si vous en avez plus d'un avec 'a == 101' ...' pour mon $ href (grep {$ _-> {'a'} == 101} @aoaoh) {### Faites quelque chose avec $ href ici} ' – Oesor

+0

Il est important de définir la variable comme une liste (d'un scalaire), en utilisant des parenthèses autour de la variable. Par exemple: my ($ ref). –

2

Plus tôt, j'utilisais foreach pour aller chercher la Hash ref comme

foreach my $href (@aoaoh){ 
    foreach my $hkeys(keys %{$href}){ 
      if(${$href}{$hkeys} == 101){ 
       my $store_ref = $href; 
      } 
    } 
} 

Maintenant, après avoir pris l'aide de eugene, je peux le faire comme

my ($hash_ref) = grep {$_->{a} == 101 } @aoaoh;

ou de manière générale (quand nous ne savons pas la clé) puis utilisez

my ($hash_ref) = grep { grep { $_ == 101 } values %$_ } @aoaoh; 
1

La méthode first est bien et ce que j'utiliser si je ne voulais le faire une ou deux fois. Mais, si vous voulez faire cela plusieurs fois, il est probablement préférable d'écrire une table de consultation, comme ceci:

my %hash_lookup; 
foreach my $h (@aoaoh) { 
    foreach my $k (keys %$h) { 
     $hash_lookup{$k}{ $h->{ $k } } = $h; 
    } 
} 

Ensuite, vous trouverez votre référence comme ceci:

my $ref = $hash_lookup{ $a_or_b }{ $value };