在 Perl 中匹配模式

在 Perl 中匹配模式

我有一个以下输入文件,其中包含:

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 变量,对应于NRin awk(读取的行数/记录数)。

相关内容