2

我有一个哈希数组:

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

我想得到一个包含所有名称的数组(显示在 CGI 弹出菜单中)。我尝试使用这个 grep 语句:

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

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

所以我目前正在使用循环来遍历所有值,将它们推入另一个数组。

有没有办法加快这个速度?

4

4 回答 4

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
橄榄球
足球

但是请注意,这与速度没有任何关系,至少在很大程度上没有关系,而且速度不应该是您最关心的问题;可读性应该是它。当然,效率很重要,但不要让自己误以为代码越简洁和神秘,程序的性能就越好。事实并非如此。要评估性能,请对您的程序进行基准测试

于 2012-05-16T09:29:36.693 回答
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,不管你怎么写,我怀疑无论如何都会在内部发生一个循环。你确定你没有试图过早地优化吗?有性能问题吗?

于 2012-05-16T09:19:06.730 回答
0
for my $i ( 0 .. $#sports) {  
     print "$sports[$i]{name} \n";    
}

事实上,你也可以使用 map 函数来循环遍历

于 2012-05-16T09:31:52.077 回答
0

如果您真的对@sports示例中的填充进行了硬编码,则解决方案很简单:

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

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

于 2012-05-16T10:59:59.313 回答