1

我有一个 Perl 问题,应该相当简单,但似乎不太正确 我有一个包含 2 列数字的文件,我需要获取第二列并将此列中的第一个值添加第二个,第二个到第三个,第三个到第四个等等。我不知道第 2 列中有多少个数字,所以我需要这样做直到文件结束,我也希望能够使用这些在我的程序中进一步价值观。我将在下面给出一个虚拟示例以及到目前为止我尝试过的代码。

示例文件制表符分隔文件 data.txt

1   29
2   26
3   24
4   28

期望输出示例

55

50

52

代码原样:

#!/usr/bin/perl -w
# use and library files
use strict;
use warnings;


my $line;
my $Val;
my $sum;
open(FH, "data.txt") or die $!;
while (my $line = <FH>){
my @val = split("\t", $line);
my $Val = $val[1];
my $sum = $Val+$Val;
print "$sum\n";
}
close FH;

行 $sum = $Val+$Val; 需要有某种循环,以便添加正确的值,但不确定如何正确处理,然后我需要以某种方式分配总和值变量名称以供以后使用。

任何帮助将不胜感激

在此先感谢 Sinead

4

2 回答 2

3

你几乎在你的例子中得到了它。$Val是你以前的值。因此,在 $sum 中使用它之前,您不能覆盖它。这意味着交换这两行并添加前一个值和当前值。

my $sum = $Val+$val[1];
my $Val = $val[1];

一个建议是,尝试为变量赋予不同的名称。大小写的差异只会导致混淆。

这是我的版本

my $prev = 0;
while (<>) {
    my(@cols) = split;
    my $sum = $prev + $cols[1];
    $prev = $cols[1];
    print "$sum\n" if ($. > 1); # skip first line
}

并调用它

perl sum.pl data.txt
于 2012-12-03T16:02:32.603 回答
1

这可以使用单行轻松完成:

perl -lanwe 'push @a, $F[1]; 
             next if @a < 2; print $a[0]+$a[1]; shift @a;" nums.csv

输出:

55
50
52

解释:

这是单行代码的解析代码:

while (<>) {              # comes from the -n switch
    chomp;                # remove line ending, -l switch does this
    our(@F) = split;      # split the input line, -a switch does this
    push @a, $F[1];       # buffer the second field
    next if @a < 2;       # check buffer size
    print $a[0] + $a[1];  # print sum
    shift @a;             # remove first value from buffer
}

总之:

  • -l为你处理你的行尾
  • -a在空白处自动拆分输入行。-F您可以使用开关自己提供拆分模式,例如-F"\t"
  • -n在您的代码周围放置一个while(<>)循环。这有效地将参数作为文件名并循环遍历文件内容。
  • -w启用警告,这是一件好事。
于 2012-12-03T16:19:21.580 回答