Perl, получите все значения хэш-функции

Скажем, в 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?

6
задан Mike 15 June 2010 в 20:16
поделиться

4 ответа

Да. Там есть.

my @list = map {
    exists $_->{foo} ? $_->{foo} : die 'hashed lacked foo'
  }
  @hash_list
;
6
ответ дан 10 December 2019 в 02:42
поделиться

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

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

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

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

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

2
ответ дан 10 December 2019 в 02:42
поделиться
if ( @hash_list != grep { exists $_->{foo} } @hash_list ) {
    # test failed
}
0
ответ дан 10 December 2019 в 02:42
поделиться

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

my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list
1
ответ дан 10 December 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: