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하고 오류 또는 줄 번호를 인쇄합니다. 이 변수는 in (읽은 라인/레코드 수) $.에 해당하는 특수 Perl 변수입니다 .NRawk

관련 정보