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ループを1行に減らすこともできます。

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、エラーまたは行番号を印刷します。この変数は、in(読み込まれた行/レコード数)$.に対応する特別なPerl変数です。NRawk

関連情報