Perl, получи все значения хешей - PullRequest
7 голосов
/ 16 июня 2010

Допустим, в Perl у меня есть список ссылок на хеш, и каждая из них должна содержать определенное поле, скажем, foo.Я хочу создать список, который содержит все сопоставления foo.Если есть хеш, который не содержит foo, процесс должен завершиться неудачей.

@hash_list = (
 {foo=>1},
 {foo=>2}
);

my @list = ();
foreach my $item (@hash_list) {
   push(@list,$item->{foo});
}

#list should be (1,2);

Есть ли более короткий способ сделать это в Perl?

Ответы [ 4 ]

6 голосов
/ 16 июня 2010

Да. есть.

my @list = map {
    exists $_->{foo} ? $_->{foo} : die 'hashed lacked foo'
  }
  @hash_list
;
2 голосов
/ 16 июня 2010

Для этого можно использовать функцию map:

@hash_list = (
 {foo=>1},
 {foo=>2}
);

@list = map($_->{foo}, @hash_list);

map применяет функцию в первом аргументе ко всем элементам второго аргумента.

grep также хорош для фильтрации элементовв списке и работает так же.

1 голос
/ 16 июня 2010

Ответ Эвана близок, но он возвращает хеш-значения, а не значение foo.

my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list
0 голосов
/ 16 июня 2010
if ( @hash_list != grep { exists $_->{foo} } @hash_list ) {
    # test failed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...