Perl循环打印多次结果

时间:2016-07-13 01:48:53

标签: perl loops

我想比较一行与文件中的每一行,如果前三列相同,我想组合这些行并将第四列添加到一起

到目前为止,这是我的perl脚本

a   4360    5440    23
a   4360    5440    44
a   4360    5440    247
b   0   1090    10
b   0   1090    11
b   1090    3550    10
b   1090    3550    11

这就是我输入的内容

a   4360    5440    314
a   0   1090    21
a   1090    3550    21

这就是我想要的输出

viewPagerVP.setCurrentItem(0);

现在我什么都没得到

1 个答案:

答案 0 :(得分:2)

如果您在代码中添加了use warningsuse strict,则会看到:

Global symbol "$oldLet" requires explicit package name at foo.pl line 8.
Global symbol "$oldLet" requires explicit package name at foo.pl line 9.
Global symbol "$oldStart" requires explicit package name at foo.pl line 9.
Global symbol "$oldStop" requires explicit package name at foo.pl line 9.
Global symbol "$chr" requires explicit package name at foo.pl line 10.
Global symbol "$oldNum" requires explicit package name at foo.pl line 10.
Execution of foo.pl aborted due to compilation errors. at foo.pl line 18.

问题是您使用的是尚未声明的变量,因此它们隐式为空,因此您的if ( defined $oldLet )将不会为真。

解决方案是在while循环之前声明变量。

另一个问题是,当您可能意味着$chr时,您尝试打印$let

这是一个工作版本:

<强> count.pl

#!/usr/bin/env perl

use warnings;
use strict;

my ($oldLet,$oldStart,$oldStop,$oldNum);
while (<>) {
    my ($let, $start, $stop, $num) = split;
    if ( defined $oldLet ) {
        if ($let eq $oldLet and $start == $oldStart and $stop == $oldStop) {
            $oldNum += $num; # Add up the num column
        } else {
            # Output the results
            print $oldLet,"\t",$oldStart,"\t",$oldStop,"\t",$oldNum, "\n";
            $oldNum = $num;
        }
    } else {
        $oldNum = $num;
    }

    $oldLet = $let;
    $oldStart = $start;
    $oldStop = $stop;
}

# Last group
print $oldLet,"\t",$oldStart,"\t",$oldStop,"\t",$oldNum, "\n";

<强>输出

cat input | perl count.pl

a       4360    5440    314
b       0       1090    21
b       1090    3550    21