如何从散列数组中获取哈希引用的值?

问题描述:

我有一个散列数组,每个散列包含相同的键,但值是唯一的。基于特定的价值,我需要存储散列参考。如何从散列数组中获取哈希引用的值?

参见下面的例子正确地理解它:

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

现在我将检查哈希键a包含值101。如果是,那么我需要存储整个哈希引用。

如何做到这一点?

+3

你可以得到一些想法线程在http://stackoverflow.com/questions/934225/search-for-hash-in-an-array-by-value – ppant 2010-09-24 08:01:50

+0

@ppant:谢谢,链接也很有用。 – 2010-09-24 08:39:46

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

或使用List::Utilfirst()

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

或者,如果你可能有多个'a == 101'...'为我的$ href(grep {$ _-> {'a'} == 101} @aoaoh){###做些什么$ href here}' – Oesor 2011-04-04 19:36:15

+0

使用变量周围的圆括号来定义像列表(一个标量)的变量非常重要。例如:my($ ref)。 – 2015-07-15 12:38:48

早些时候,我用foreach从尤金服用后帮取的Hash ref

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

现在,我可以做到这一点像

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

或一般的方式(当我们不知道的键),然后使用

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

first方法是好的,如果我只想做一次或两次,我想要的使用。但是,如果你想这样做很多时候,它可能会更好写一个查找表,就像这样:

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

然后你发现你的参考,像这样:

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