我有一个以下输入文件,其中包含:
000ABCDEFGHIJKLMN2018022623595900021
CGT11~|~|110~|~|221~|~|H0331~|~|~|~|
CGT11~|~|110~|~|222~|~|H0332~|~|~|~|
CGT11~|~|110~|~|223~|~|H0335~|~|~|~|
CGT11~|~|110~|~|224~|~|H0333~|~|~|~|
99800000000000000011~|~|~|~|~|~|~|~|
我想计算行数并转到文件的最后一行并检查“999”。如果匹配,则将继续下一步,否则将抛出错误消息。目前我的输入文件的最后一行有“998”,所以它会抛出一条错误消息。我怎样才能在 Perl 中做到这一点。有人可以帮我解决这个问题吗?
我当前的代码如下
#!/usr/bin/perl
open(FILE, "<deep.txt") or die "Could not open file: $!";
my $lines = 0;
while (<FILE>) {
$lines++;
if($Number =~ m/\d{1,3}/){
$N = $Number;
print "$N";
}
}
print "The no of lines present is $lines \n";
答案1
不完全确定,但这可能会有所帮助
#!/usr/bin/perl
use strict;
use warnings;
my $fname = "deep.txt";
open(my $fh, "<:encoding(ASCII)", $fname) || die "cannot open $fname for reading";
my $num = 0;
while(<$fh>)
{
$num = substr $_, 0, 3 if eof;
}
close($fh) || warn "cannot close $fname";
print "Oops, last line doesn't start with 999!\n" if $num != 999;
该eof
检查有助于了解它是否是正在读取的文件的最后一行
while 循环也可以缩短为一行:
eof and $num = substr $_, 0, 3 while(<$fh>);
进一步阅读:
答案2
使用awk
:
awk 'END { if ($0 !~ /^999/) print "error"; else printf("Lines in file: %d\n", NR) }' file
如果文件的最后一行不是以999
该字符串开头error
,则会显示。否则,文件中的行数将显示在一条短消息中。
Perl 也是如此:
perl -ne '$line=$_; END { if ($line !~ /^999/) { print "error\n" } else { printf "Lines in file: %d\n", $. } }' file
脚本(美化):
$line = $_;
END {
if ( $line !~ /^999/ ) { print "error\n" }
else { printf "Lines in file: %d\n", $. }
}
这设置$line
为当前输入行。
END
当没有进一步的输入可用时,执行该块。它测试最后一个是否$line
以 开头999
,并打印错误或行数。该$.
变量是一个特殊的 Perl 变量,对应于NR
in awk
(读取的行数/记录数)。