0

以下に示すように、空白行で区切られた数字のリストを含むテキスト ファイルがあります。各要素の合計 1st、2nd、3rd など

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]column の合計が含まれます$i

または、もう少し 'perlish':

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