Как я могу получить ссылку на хэш из массива хэшей по одному из его значений? - PullRequest
3 голосов
/ 24 сентября 2010

У меня есть массив хэшей, каждый из которых содержит одинаковые ключи, но значения уникальны. Исходя из особой ценности, мне нужно хранить хэш ref.

См. Пример ниже, чтобы понять это правильно:

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

Теперь я проверю, содержит ли ключ хеша a значение 101. Если да, то мне нужно хранить весь хэш ref.

Как это сделать?

Ответы [ 3 ]

14 голосов
/ 24 сентября 2010
my $key = "a";
my ($ref) = grep { $_->{$key} == 101 } @aoaoh;

или List::Util first():

use List::Util 'first';
my $ref = first { $_->{$key} == 101 } @aoaoh;
2 голосов
/ 24 сентября 2010

Раньше я использовал 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; 
1 голос
/ 24 сентября 2010

Метод 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 };
...