2010-09-24 2 views
3

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

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

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

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

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

+3

Вы можете получить некоторое представление от thread at http://stackoverflow.com/questions/934225/search-for-hash-in-an-array-by-value – ppant

+0

@ppant: спасибо, ссылка также полезна. –

ответ

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

или с помощью List::Util «s first():

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

Или если у вас может быть более одного с 'a == 101' ...' для моего $ href (grep {$ _-> {'a'} == 101} @aoaoh) {### Сделайте что-нибудь с $ href here} ' – Oesor

+0

Важно определить переменную как список (одного скаляра), используя скобки вокруг переменной. Например: my ($ ref). –

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; 
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 };