在Perl中,如何将哈希数组转换为值数组?

时间:2012-05-16 08:56:02

标签: arrays perl hash mapping

我有一系列哈希:

my @sports;
push @sports, { id=>1, name=>'Rugby' };
push @sports, { id=>2, name=>'Football' };

我希望获得所有名称的数组(显示在CGI弹出菜单中)。我尝试使用这个grep语句:

my @names = grep { $_->{name} } @sports;

但它只返回一个哈希值数组......

所以我现在正在使用循环迭代所有值,将它们推送到另一个数组。

有没有办法加快速度?

4 个答案:

答案 0 :(得分:7)

您需要map,而不是grep

use strict;
use warnings;
my @sports;
push @sports, { id=>1, name=>'Rugby' };
push @sports, { id=>2, name=>'Football' };
my @names = map $_->{name}, @sports;
print for @names;
D:\temp> perl -l m.pl
Rugby
Football

但请注意,这与速度没有任何关系,至少在很大程度上并不是很明显,速度不应该是你最关心的问题;可读性应该是它。当然,效率很重要,但不要让自己被愚弄,认为代码越简洁和神秘,程序的性能就越好。事实并非如此。 To assess performance, benchmark your programs

答案 1 :(得分:0)

my @sports;
push @sports, { id=>1, name=>'Rugby' };
push @sports, { id=>2, name=>'Football' };
foreach(@sports){
  push @names, $_->{'name'};
}
foreach(@names){
  print "$_\n";
}

啊,对不起 - 重读你的帖子。 TBH,无论你怎么写,我怀疑无论如何都会在内部发生循环。你确定你不想过早地优化吗?是否存在性能问题?

答案 2 :(得分:0)

for my $i ( 0 .. $#sports) {  
     print "$sports[$i]{name} \n";    
}

实际上你也可以使用map函数循环

答案 3 :(得分:0)

如果您真的对@sports的填充进行了硬编码,那么解决方案是微不足道的:

my (@sports, @names);
push @sports, { id=>1, name=>'Rugby' };
push @names, 'Rugby';
push @sports, { id=>2, name=>'Football' };
push @names, 'Football';

这完全避免了第二个循环。