我有一系列哈希:
my @sports;
push @sports, { id=>1, name=>'Rugby' };
push @sports, { id=>2, name=>'Football' };
我希望获得所有名称的数组(显示在CGI弹出菜单中)。我尝试使用这个grep语句:
my @names = grep { $_->{name} } @sports;
但它只返回一个哈希值数组......
所以我现在正在使用循环迭代所有值,将它们推送到另一个数组。
有没有办法加快速度?
答案 0 :(得分:7)
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';
这完全避免了第二个循环。