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

あなたの例のように、の入力を本当にハードコーディングした場合、解決策は簡単です@sports:

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

これにより、2 番目のループが完全に回避されます。

于 2012-05-16T10:59:59.313 に答える