让我们说在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中有更简洁的方法吗?
答案 0 :(得分:6)
是。有。。
my @list = map {
exists $_->{foo} ? $_->{foo} : die 'hashed lacked foo'
}
@hash_list
;
答案 1 :(得分:2)
您可以使用地图功能:
@hash_list = (
{foo=>1},
{foo=>2}
);
@list = map($_->{foo}, @hash_list);
map将第一个参数中的函数应用于第二个参数的所有元素。
grep对于过滤列表中的元素也很酷,并且工作方式相同。
答案 2 :(得分:1)
Evan的答案很接近,但会返回hashrefs而不是foo的值。
my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list
答案 3 :(得分:0)
if ( @hash_list != grep { exists $_->{foo} } @hash_list ) {
# test failed
}
答案 4 :(得分:0)
如果您想获取哈希值,请使用 values()
函数。像这样...
print Dumper(values %$hash);
值 HASH
在列表上下文中,返回一个包含命名哈希的所有值的列表。
(来源:PerlDoc.org.)
在线演示: IDEOne
use Data::Dumper;
my $hash = {
soybeans=>1,
chickpeas=>2,
};
print Dumper(values %$hash);