我有一个哈希数组,每个哈希包含相同的键,但值是唯一的。在特定值的基础上,我需要存储散列引用。
请参阅以下示例以正确理解它:
my @aoaoh = (
{ a => 1, b => 2 },
{ a => 3, b => 4 },
{ a => 101, b => 102 },
{ a => 103, b => 104 },
);
现在我将检查散列键a
是否包含值101
。如果是,那么我需要存储整个散列引用。
怎么做?
答案 0 :(得分:14)
my $key = "a";
my ($ref) = grep { $_->{$key} == 101 } @aoaoh;
或使用List::Util
的{{1}}:
first()
答案 1 :(得分:2)
之前,我使用foreach
来获取Hash ref
之类的
foreach my $href (@aoaoh){
foreach my $hkeys(keys %{$href}){
if(${$href}{$hkeys} == 101){
my $store_ref = $href;
}
}
}
现在在获得eugene的帮助后,我可以像
那样做 my ($hash_ref) = grep {$_->{a} == 101 } @aoaoh;
或以一般方式(当我们不知道密钥时)然后使用
my ($hash_ref) = grep { grep { $_ == 101 } values %$_ } @aoaoh;
答案 2 :(得分:1)
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 };