我有一个看起来像这样的文件:
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)
它没有产生预期的结果.有任何想法吗?
您正在迭代输入文件的行,并且每次打印一行,因此您的输出只有输入的行数.
相反,你想要保留一个计数器(就像你做的那样),并且对于每一行,当该计数器小于行上的数字时,打印$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,我已经包含$!在错误消息中,所以如果出现问题,你就会知道它是什么.