如何使用Perl获得减少的频率序列累积?

nev*_*int 3 statistics perl

我有一个看起来像这样的数据:

3
2
1
5
Run Code Online (Sandbox Code Playgroud)

我想得到的是这些数据产生的"递减"累积

11
8
6
5
0
Run Code Online (Sandbox Code Playgroud)

在Perl中这样做的紧凑方式是什么?

DVK*_*DVK 7

perl -e '{ my @a = (3,2,1,5); map { $s+=$_ } @a; 
           map { print "$s\n"; $s-= $_ } (@a,0) }'
Run Code Online (Sandbox Code Playgroud)

要么

perl -e '{ my @a = (3,2,1,5); my @r = (0); 
           map { $s += $_ ; push @r, $s } reverse @a; 
           print join("\n", reverse @r)."\n" }'
Run Code Online (Sandbox Code Playgroud)

注意:这些都需要一个额外的语句my $s=0;使用strict.

但我可以问为什么?

  • 好的答案.几个细节.使用`use strict`,你不需要`my $ s = 0`; 相反,你只需要`我的$ s`.另外,为什么void-context`map`而不是好的`for`? (2认同)

Sin*_*nür 6

我不确定你是否能比@ DVK的解决方案更紧凑.

#!/usr/bin/perl

use strict; use warnings;
use List::Util qw(sum);

my @array = (3, 2, 1, 5);
my $sum = sum @array;

for my $x ( @array ) {
    print $sum, "\n";
    $sum -= $x;
}

print "0\n";
Run Code Online (Sandbox Code Playgroud)

结合sum使用map:

#!/usr/bin/perl

use strict; use warnings;

use List::Util qw(sum);

my @array = (3, 2, 1, 5);
my $sum = sum @array;

print join("\n", map $sum -= $_, (0, @array)), "\n";
Run Code Online (Sandbox Code Playgroud)