Perl,获取所有哈希值
假设在Perl中,我有一个哈希引用列表,每个引用都需要包含一个特定字段,比如Perl,获取所有哈希值,perl,list,hash,Perl,List,Hash,假设在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中有没有更简洁的方
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
;
Evan的答案很接近,但将返回hashrefs而不是foo的值
my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list
您可以为此使用映射功能:
@hash_list = (
{foo=>1},
{foo=>2}
);
@list = map($_->{foo}, @hash_list);
map将第一个参数中的函数应用于第二个参数的所有元素
grep对过滤列表中的元素也很酷,并且工作方式相同 TLDR答案
如果要获取哈希值,请使用values()
函数。像这样
print Dumper(values %$hash);
来源
值哈希
在列表上下文中,返回由命名哈希的所有值组成的列表
(来源:)
演示
在线工作演示,网址:
我只是想澄清一下,您并不是在创建映射列表,而是在创建一个由每个哈希值组成的列表,而您的代码示例与“进程失败”无关,所以您不仅仅是要求更简洁。一般来说,只要您发现自己在做
foreach。。。{…推..}
您可以使用map或grep使代码更短、更简单。是的,我解决了这个问题。而且,我也让它死了,他的代码和他的问题之间有一种脱节。对于这样的复杂映射表达式,使用块语法而不是裸表达式通常更容易阅读。更好的是+1,我一直使用裸语法处理短表达式,可能唯一没有得到块的长表达式是返回arrayref:`map[…] => ...`
print Dumper(values %$hash);
use Data::Dumper;
my $hash = {
soybeans=>1,
chickpeas=>2,
};
print Dumper(values %$hash);