2013-02-08 36 views
0

我有值的数组,我想用另一个数组转换它,像这样在Perl中,是否可以按位置使用另一个阵列位置来转换数组?

@raw_values  = qw(10 20 30 40); 

@adjustment_factors = qw(1 2 3 4); 


#the expected value array 
@expected_values = qw(10 40 90 160); 

有没有这样做,那么这更Perlish的方法吗?

for my $n (0..$#raw_values){ 
    $expected_values[ $n ] = $raw_values[ $n ] * $adjustment_factors[ $n ] 
} 

数组总是有相同数量的元素,我有几千个进程。

回答

4

使用map

@expected_values = map { $raw_values[$_] * $adjustment_factors[$_] } 0 .. $#raw_values; 

另一种选择是,先分配初始值,然后对其进行修改:

@expected_values = @raw_values; 
$x = 0; 
$_ *= $adjustment_factors[$x++] for @expected_values; 

或者,如果你不需要@adjustment_factors了,你可以清空:

@expected_values = map { $_ * shift @adjustment_factors } @raw_values; 
+0

优秀的,正是我一直在寻找 – kaklon 2013-02-08 12:26:56

+1

@kaklon:看到其他的可能性更新。 – choroba 2013-02-08 12:33:08

3

pairwise是更多惯用的,CPAN解决方案。

use List::MoreUtils qw<pairwise>; 

my @expected_values = pairwise { $a * $b } @raw_values, @adjustment_factors; 

List::MoreUtils

+0

非常好,谢谢你,我也会试一试 – kaklon 2013-02-08 13:43:28

+0

这个模块的错误追踪器让我有些担心。 – choroba 2013-02-08 13:59:04

+0

@ choroba,杰出的“bug”倾向于遵循一些模式。最大的一个是“愿望清单” - 这是某人想要MoreUtils做的一些想法,但事实并非如此。下一个组是没有被正式标记为修复的东西,但是如果你看看这个线程,* a *修正就被放入了。然后,就会出现类似如果你通过XS版本成为“坏数组参考” ,你会遇到段错误。所以,诀窍不是传递一个错误的数组引用。我在一家Perl店工作,很多人都用这个mod很厉害。 – Axeman 2013-02-08 14:09:01

相关问题