Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl,获取所有哈希值_Perl_List_Hash - Fatal编程技术网

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中有没有更简洁的方

假设在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);