我的数据如下:
3
2
1
5
我想得到的是这些数据的累计“减少” 产生
11
8
6
5
0
在Perl中这样做的紧凑方式是什么?
答案 0 :(得分:7)
perl -e '{ my @a = (3,2,1,5); map { $s+=$_ } @a;
map { print "$s\n"; $s-= $_ } (@a,0) }'
或
perl -e '{ my @a = (3,2,1,5); my @r = (0);
map { $s += $_ ; push @r, $s } reverse @a;
print join("\n", reverse @r)."\n" }'
注意:这两者都需要使用my $s=0;
的额外声明strict
。
但我可以问为什么?
答案 1 :(得分: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";
将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";
答案 2 :(得分:2)
你去吧
#!/usr/bin/perl -w
use strict;
use List::Util qw (sum);
my @a = ( 3,2,1,5);
my $sum = sum(@a);
foreach ( @a )
{
print "$sum ";
$sum -= $_;
}
print $sum;
答案 3 :(得分:1)
perl -e 'print join(", ", reverse map { $s=$s+$_ } reverse qw/3 2 1 5 0/)'