如何在Perl中按元素求和数组?

Dmy*_*nko 14 arrays perl sum elementwise-operations

我有两个数组:

@arr1 = ( 1, 0, 0, 0, 1 );
@arr2 = ( 1, 1, 0, 1, 1 );
Run Code Online (Sandbox Code Playgroud)

我想总结两个数组的项目,以获得新的数组

( 2, 1, 0, 1, 2 );
Run Code Online (Sandbox Code Playgroud)

我可以不循环遍历数组吗?

cat*_*alk 29

对于Perl 5:

use List::MoreUtils 'pairwise';
@sum = pairwise { $a + $b } @arr1, @arr2;
Run Code Online (Sandbox Code Playgroud)

  • 这确实在两个数组中循环,它只是隐藏在成对的内部. (5认同)
  • @melco-man:不要声明我的($ a,$ b) - 这里是特殊变量,'pairwise'为你处理$ a和$ b本地化 (3认同)

rjs*_*ing 8

如果您使用的是Perl 6:

@a = (1 0 0 0 1) <<+>> (1 1 0 1 1)  #NB: the arrays need to be the same size
Run Code Online (Sandbox Code Playgroud)

Perl 6的出现日历有更多的例子.

  • 是"<< + >>"气垫船运营商? (5认同)

rjp*_*rjp 8

从根本上说,不,没有"循环遍历数组"就不能这样做,因为你需要访问两个数组的每个元素才能求和.到目前为止,这两个答案都只是隐藏了一个抽象层下的循环,但它仍然存在.

如果您担心循环非常大的数组,最好考虑其他方法来保持最新的总和.


gho*_*g74 7

循环数组有什么问题?这是基本面.

@arr1 = ( 1, 0, 0, 0, 1 );
@arr2 = ( 1, 1, 0, 1, 1 );
for ($i=0;$i<scalar @arr1;$i++){
    print $arr[$i] + $arr2[$i] ."\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 对于循环?在Perl?我的天哪,你在做什么? (10认同)
  • 我确切地知道我在做什么.我不喜欢认为复杂,这就是全部. (3认同)

dao*_*oad 6

你已经看过循环的C风格了pairwise.这是一个惯用的Perl for循环和map:

my @arr1 = ( 1, 0, 0, 0, 1 );
my @arr2 = ( 1, 1, 0, 1, 1 );

my @for_loop;
for my $i ( 0..$#arr1 ) { 
    push @for_loop, $arr1[$i] + $arr2[$i];
}

my @map_array = map { $arr1[$_] + $arr2[$_] } 0..$#arr1;
Run Code Online (Sandbox Code Playgroud)

我喜欢mappairwise最好的.我不确定我在这两个选项之间有偏好. pairwise处理一些无聊的管道细节,但它不是内置的map.另一方面,地图解决方案非常惯用,并且可能对兼职人员不透明.

所以,两种方法都没有真正的胜利.国际海事组织,这两个pairwisemap好.