如何从散列数组中获取哈希引用的值?
我有一个散列数组,每个散列包含相同的键,但值是唯一的。基于特定的价值,我需要存储散列参考。如何从散列数组中获取哈希引用的值?
参见下面的例子正确地理解它:
my @aoaoh = (
{ a => 1, b => 2 },
{ a => 3, b => 4 },
{ a => 101, b => 102 },
{ a => 103, b => 104 },
);
现在我将检查哈希键a
包含值101
。如果是,那么我需要存储整个哈希引用。
如何做到这一点?
my $key = "a";
my ($ref) = grep { $_->{$key} == 101 } @aoaoh;
或使用List::Util
的first()
:
use List::Util 'first';
my $ref = first { $_->{$key} == 101 } @aoaoh;
或者,如果你可能有多个'a == 101'...'为我的$ href(grep {$ _-> {'a'} == 101} @aoaoh){###做些什么$ href here}' – Oesor 2011-04-04 19:36:15
使用变量周围的圆括号来定义像列表(一个标量)的变量非常重要。例如: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 };
你可以得到一些想法线程在http://stackoverflow.com/questions/934225/search-for-hash-in-an-array-by-value – ppant 2010-09-24 08:01:50
@ppant:谢谢,链接也很有用。 – 2010-09-24 08:39:46