Скажем, в 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?
Да. Там есть.
my @list = map {
exists $_->{foo} ? $_->{foo} : die 'hashed lacked foo'
}
@hash_list
;
Для этого можно использовать функцию map:
@hash_list = (
{foo=>1},
{foo=>2}
);
@list = map($_->{foo}, @hash_list);
map применяет функцию в первом аргументе ко всем элементам второго аргумента.
grep также отлично подходит для фильтрации элементов в списке и работает точно так же.
if ( @hash_list != grep { exists $_->{foo} } @hash_list ) {
# test failed
}
Ответ Эвана близок, но вернет хэш-ссылки, а не значение foo.
my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list