逐行读取文件时保持计数

Sal*_*ork 2 perl

我有一个看起来像这样的文件:

1
3
7
8
Run Code Online (Sandbox Code Playgroud)

它的数量增加但不是一致的:它是随机的.

我想要一个看起来像这样的文件:

1   1
2   0
3   1
4   0
5   0 
6   0
7   1
8   1
Run Code Online (Sandbox Code Playgroud)

它填写左侧列中缺少的数字,并添加一个\t1以显示它存在于原始文件中(0表示缺席).到目前为止,我有:

#! /usr/bin/perl

use warnings;
use strict;

my $infile = $ARGV[0];

open(IN, $infile) or die ("Could not open file.");

my $counter = 0;

while ( my $line  = <IN> ) {

    chomp $line;

    if ( $counter == $line ) {
        print "$line\t1\n";
        ++$counter;
    }
    else {
        print "$counter\t0\n";
        ++$counter;
    }
}

close (IN);
Run Code Online (Sandbox Code Playgroud)

产量

0   0
1   0
2   0
3   0
Run Code Online (Sandbox Code Playgroud)

它没有产生预期的结果.有任何想法吗?

Dad*_*ada 6

您正在迭代输入文件的行,并且每次打印一行,因此您的输出只有输入的行数.

相反,你想要保留一个计数器(就像你做的那样),并且对于每一行,当该计数器小于行上的数字时,打印$counter 0,因为你的输入中没有这个数字:

#! /usr/bin/perl
use warnings;
use strict;

my $infile = $ARGV[0];

open (my $in, '<', $infile) or die ("Could not open file: $!.");

my $counter = 0;
while ( my $line  = <$in> ) {
    chomp $line;
    while ( ++$counter < $line ) {
        print "$counter\t0\n"
    }
    print "$line\t1\n" # or 'print "$counter\t1\n"', whichever you find clearer
}

close $in;
Run Code Online (Sandbox Code Playgroud)

另外,请注意我打开了3个参数,并且使用了$in文件句柄的词法变量而不是你的IN,我已经包含$!在错误消息中,所以如果出现问题,你就会知道它是什么.

  • @simbabque我不得不克制自己使用单字母变量,而`-p`删除一半脚本......`perl -plE'说"$ c\t0"而++ $ c <$ _; $ _.="\t1"'`:D (4认同)