How can I sum arrays element-wise in Perl?

前端 未结 9 497
孤城傲影
孤城傲影 2020-12-15 07:53

I have two arrays:

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

I want to sum items of both arrays to get new one like

<         


        
相关标签:
9条回答
  • 2020-12-15 08:22

    To avoid (explicit) looping, here is a solution that uses recursion "instead":

    #!/usr/bin/perl
    
    use v5.20;
    
    my @arr1 = ( 1, 0, 0, 0, 1 );
    my @arr2 = ( 1, 1, 0, 1, 1 );
    
    my @result=non_looping_pairwise_sum([ @arr1 ], [ @arr2 ]); # pass in copies, so the originals are not modified
    say "@result";
    
    sub non_looping_pairwise_sum { # only handles lists that have the same length
        my ($a1, $a2)=@_;
    
        return () if (scalar(@$a1)==0 and scalar(@$a2)==0);
    
        my $e1=shift @$a1;
        my $e2=shift @$a2;
    
        return ($e1+$e2, non_looping_pairwise_sum($a1, $a2));
    }
    

    Output:

    2 1 0 1 2
    

    Note that use v5.20 means you don't have to write use strict; use warnings, I think.

    Apologies/kudos to @parm for the idea.

    0 讨论(0)
  • 2020-12-15 08:23

    Fundamentally, no, you can't do it without "looping through arrays" because you need to access every element of both arrays in order to sum them. Both the answers so far just hide the looping under a layer of abstraction but it's still there.

    If you're concerned about looping over very large arrays, it's probably best to consider other ways of keeping the sum up-to-date as you go.

    0 讨论(0)
  • 2020-12-15 08:23

    If you're really afraid of looping, then you can binary chop the arrays, sum the pairs, then recursively reassemble the resulting array. No looping there, and as a bonus you get to learn how part of the fast-fourier transform derivation works.

    0 讨论(0)
  • 2020-12-15 08:28

    If you're using Perl 6:

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

    The Perl 6 Advent Calendar has more examples.

    0 讨论(0)
  • 2020-12-15 08:30

    From http://www.perlmonks.org/?node_id=122393

    @a = qw(1 2 3 4);
    @b = qw(1 2 3 4);
    @c = (); 
    
    @c = map { $a[$_] + $b[$_] } ( 0 .. (@a > @b ? $#a : $#b) );
    

    Or:

    $c[@c] = $a[@c] + $b[@c] while defined $a[@c] or defined $b[@c];
    

    Or:

    $c[$_] = $a[$_] + $b[$_] for 0 .. (@a > @b ? $#a : $#b);
    

    Or (in Perl 6):

    @c = @a ^+ @b
    
    0 讨论(0)
  • 2020-12-15 08:32

    what's wrong with looping over arrays? that's the fundamentals.

    @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";
    }
    
    0 讨论(0)
提交回复
热议问题