【发布时间】:2018-06-29 05:08:13
【问题描述】:
我有一个包含许多条目的数组,例如:
"a->b->c->x->n"
"something->something1->somethingelse"
我想一次从数组中提取所有奇数元素,并用它们的唯一值做一个哈希,比如:
%s = {
"b" => '1'
#the values don't matter too much, they could be # occurences, I am going to use keys %s.
"x" => '1'
"something1" => '1'
}
目前我分几步执行此操作,但仅循环遍历数组会花费大量时间,因此我认为有办法做得更好。
my ( @odds, @evens );
foreach (@arr) {
my $i = 0;
push @{ $i++ % 2 ? \@odds : \@evens }, $_ for split /->/, $_;
}
%s = map { $_ => '1'; } @odds;
对一次处理整个数组有什么建议吗?
【问题讨论】:
-
@ikegami:我见过一次处理整个数组的 perl 代码,例如使用 grep 或 map。我认为这可能比遍历每个条目更快。
-
你错了。
grep和map与for一样多的循环,并且将结果标量分配给数组的赋值同样循环所有标量。 -
注释。 1) 使用
for my $i (0..$#arr)2) 只收集赔率 /// 否则,您必须访问每个元素,并且必须访问每个(第二个)子字符串。 (但试图访问每秒子字符串需要函数调用,它只会更慢。) -
Re "
grep和map和for一样多的循环",实际上for(@a) BLOCK比map BLOCK @a和@987654333 更有效@ 因为它被优化为迭代@a的索引,而map和grep将@a的所有元素放在堆栈上。