2013-02-08 15 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

相關問題