Как я могу получить убывающую совокупность частотных рядов, используя Perl? - PullRequest
3 голосов
/ 23 марта 2010

У меня есть данные, которые выглядят так:

3
2
1
5

То, что я хочу получить, это «убывающая» совокупность этих данных. получая

11
8
6
5
0

Что такое компактный способ сделать это в Perl?

Ответы [ 4 ]

7 голосов
/ 23 марта 2010
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.

Но могу я спросить, ПОЧЕМУ?

6 голосов
/ 23 марта 2010

Я не уверен, что вы можете получить более компактный вариант, чем решение @ 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 голосов
/ 23 марта 2010

Вот, пожалуйста,

   #!/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;
1 голос
/ 23 марта 2010
perl -e 'print join(", ", reverse map { $s=$s+$_ } reverse qw/3 2 1 5 0/)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...