4

我有一个哈希数组,每个哈希包含相同的键但值是唯一的。在特定值的基础上,我需要存储哈希引用。

请参阅以下示例以正确理解它:

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

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

怎么做?

4

3 回答 3

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

或使用List::Util's first()

use List::Util 'first';
my $ref = first { $_->{$key} == 101 } @aoaoh;
于 2010-09-24T08:10:56.400 回答
2

早些时候,我用它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; 
于 2010-09-24T08:38:41.297 回答
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 };
于 2010-09-24T14:20:55.097 回答