добавление списка массивов perl - PullRequest
0 голосов
/ 08 марта 2011

У меня есть текстовый файл со списком чисел, разделенных пустой строкой, как показано ниже: я хочу добавить все первые (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 ]

6 голосов
/ 08 марта 2011

Используйте split, чтобы получить все поля.Отслеживайте итоговую сумму в массиве (индекс которого сопоставляется со столбцами в вашем файле).

Примерно так:

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

Обратите внимание, что split разбиваетсяпробел по умолчанию.Вы можете использовать другие разделители, если хотите.

РЕДАКТИРОВАТЬ: Этот ответ, к сожалению, бесполезен, теперь, когда вопрос был прояснен.Вместо этого используйте ответ Брайана Роуча.

5 голосов
/ 08 марта 2011

РЕДАКТИРОВАТЬ: Из уточненного вопроса, необходимо иметь дело с пустыми строками и возможностью того, что ряд чисел разбит на несколько строк.

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 до тех пор, пока вы не нажмете пустую строку, а затем выполните вычисления.

3 голосов
/ 08 марта 2011
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;
}
2 голосов
/ 08 марта 2011

Вы можете попробовать что-то вроде этого:

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];
    }
}
...