如何在Perl中对每列数据求和?

时间:2009-10-20 18:59:51

标签: perl

我有一个包含以下数据的文件:

1==0==2
5==3==2
7==1==0

如何逐列添加数值。我需要总结并打印出来像

1==0==2
5==3==2
7==1==0
13==4==4   * summation column wise (This is what I want to calculate using perl)

我猜你误解了我的问题。我已经再次编辑了我的问题......我的意思是我在表格中有很多这样的专栏 13 == 4 == 4是我想要添加到我的文件中的总和列。

我能够只为第一列做到这一点,但我还需要学习如何为所有其他列。

我的代码:

#!/usr/bin/perl

use strict;
use warnings;

open (TEMPTABLE,"temp_data") or die "Cannot open file\n";

my @temp_table_data=< TEMPTABLE > ;
chomp @temp_table_data;

my $total_sum;
for(my $i=0;$i<=$#temp_table_data;$i++)
{
print "$temp_table_data[$i]\n";
my @col=split('==',$temp_table_data[$i]);
for(my $m=0;$m<1;$m++)
{
$total_sum+=$col[$m];
}    
}
print "$total_sum\n";

OUTPUT:
1==0==2
5==3==2
7==1==0
13

我不想总结ROW而是COLUMN。

4 个答案:

答案 0 :(得分:6)

人们试图在他们的答案中非常聪明。我认为没有技巧的情况会更清楚。你当然不需要pairwise,我认为在这种情况下它会使代码更难以遵循。这很简单,只需内置Perl:

my @sums;

while( <DATA> ) {
   my @summands = split /==/;

   foreach my $i ( 0 .. $#summands ) {
   $sums[$i] += $summands[$i];
   }
}

print "Sums are (@sums)\n";

__END__
1==0==2
5==3==2
7==1==0

答案 1 :(得分:4)

你要做的事似乎并不复杂。如果'=='是您的列分隔符:

use strict;
use warnings;
use List::MoreUtils qw<pairwise>;

our ( $a, $b );

my @totals;

while ( my $record = <DATA> ) { 
    chomp $record;
    my @data = split /==/, $record;
    push @totals, ( 0 ) x ( @data - @totals ) if @data > @totals;
    pairwise { $a += $b } @totals, @data;
 }
__DATA__
1==0==2
5==3==2
7==1==0
13==4==4

答案 2 :(得分:3)

  1. 创建一个可容纳数组的变量
  2. 浏览每一行并按顺序将值添加到数组
  3. 重复完成。

答案 3 :(得分:1)

这是我的参赛作品

use strict;
use warnings;

my @LineTotalsArray;

while (my $line = <DATA>) {
   print $line;
   chomp $line;

   my $index=0;
   for my $val ( split /==/, $line ) {
      $LineTotalsArray[ $index++ ] += $val;
   }
}

print join('==', @LineTotalsArray), "\n";

__DATA__
1==0==2
5==3==2
7==1==0