0

我有一个文本文件,其中包含由空白行分隔的数字列表,如下所示 - 我想添加所有第一个 (20.187+19.715+20.706...) 、第二个元素 (15.415+14.726+15.777) 等等以获得第 1、2、3 等每个元素的总和

20.187 15.415  8.663  6.001  6.565  6.459  6.564 ..

19.715 14.726  8.307  5.833  6.367  6.089  6.444 ..

20.706 15.777  9.185  6.546  7.327  7.172  7.084 ...

因为它们*没有按列排列*我怎么能把数组的元素加起来。

4

4 回答 4

6

用于split获取所有字段。跟踪数组中的运行总计(其索引映射到文件中的列)。

像这样的东西:

while (<$file>)
{
  chomp;
  my $index = 0;
  $total[$index++] += $_ for split;
}

请注意,split默认情况下会拆分空格。如果您愿意,可以使用其他分隔符。


编辑:这个答案很遗憾没用,现在问题已经澄清了。请改用 Brian Roach 的答案。

于 2011-03-08T18:45:37.540 回答
5

编辑:从澄清的问题来看,需要处理空行以及一系列数字被分成多行的可能性。

my @totals;
my @currentVals;

while (my $line = <FILE>)
{
    chomp($line);
    if ($line eq "")
    {
        for ($i = 0; $i < @currentVals; $i++)
        {
            @totals[$i] += @currentVals[$i];
        }    
        @currentVals = ();
    }
    else
    {
        push @currentVals,  split(' ', $line);
    }

}

这应该可以满足您的需求。您需要继续添加到 currentVals 数组中,直到遇到空行,然后进行数学运算。

于 2011-03-08T18:45:55.903 回答
3
use strict;
use warnings;

# Paragraph mode (so that blank lines become our input delimiter).
local $/ = "\n\n";

my @totals;

while (<>){
    my $i;
    $totals[$i++] += $_ for split;
}
于 2011-03-08T19:41:54.030 回答
2

你可以尝试这样的事情:

my @sum;
while (<>) {
    chomp;
    my @items = split /\s+/;
    for (my $i=0; $i<@items; $i++) {
        $sum[$i] += $items[$i];
    }
}

$sum[$i]将包含列的总数$i

或者,稍微“​​perlish”:

my @sum;
while (<>) {
    chomp;
    my @items = split;
    for my $i (0 .. $#items) {
        $sum[$i] += $items[$i];
    }
}
于 2011-03-08T18:45:51.830 回答