添加数组列表 perl

发布于 2024-10-21 01:28:41 字数 373 浏览 3 评论 0原文

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

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 ...

因为它们*没有按列排列*我如何将数组的元素相加。

I have a text file with list of numbers separated by blank line as given below-
i want to add all the first (20.187+19.715+20.706...) , second elements (15.415+14.726+15.777) and so on
to get the total of each element 1st,2nd,3rd etc

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 ...

since they are *not arranged in columns* how could i add up the elements of the array.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

往事随风而去 2024-10-28 01:28:41

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

像这样的事情:

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

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


编辑:遗憾的是,既然问题已经澄清,这个答案毫无用处。请改用布莱恩·罗奇的答案。

Use split to get all the fields. Keep track of a running total in an array (the indexed of which being mapped to the columns in your file).

Something like this:

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

Note that split splits on whitespace by default. You can use other delimiters if you like.


EDIT: This answer is sadly useless, now that the question has been clarified. Use Brian Roach's answer instead.

孤城病女 2024-10-28 01:28:41

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

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 数组中,直到遇到空行,然后进行数学计算。

EDIT: From the clarified question, Need to deal with the blank lines and the possibility that a series of numbers is broken onto multiple lines.

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);
    }

}

This should do what you're looking for. You need to keep adding onto the currentVals array until you hit a blank line, then do the math.

泪冰清 2024-10-28 01:28:41
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;
}
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;
}
稍尽春風 2024-10-28 01:28:41

您可以尝试这样的操作:

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

$sum[$i] 将包含列$i 的总计。

或者,稍微“​​毁灭”一点:

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

You could try something like this:

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

$sum[$i] will contain the total of column $i.

Or, slightly more 'perlish':

my @sum;
while (<>) {
    chomp;
    my @items = split;
    for my $i (0 .. $#items) {
        $sum[$i] += $items[$i];
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文