我有一个文本文件,其中包含以空白行分隔的数字列表,如下所示 - 我想添加所有的第一个(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 ...
因为 * 没有列在列中 * 我怎么能把数组的元素加起来。
答案 0 :(得分:6)
使用split
获取所有字段。跟踪数组中的运行总计(其索引被映射到文件中的列)。
这样的事情:
while (<$file>)
{
chomp;
my $index = 0;
$total[$index++] += $_ for split;
}
请注意,split
默认情况下会拆分空格。如果您愿意,可以使用其他分隔符。
编辑:由于问题已得到澄清,这个答案可悲无用。请改用Brian Roach的答案。
答案 1 :(得分: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数组,直到您点击一个空行,然后进行数学运算。
答案 2 :(得分: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;
}
答案 3 :(得分: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];
}
}