![Perl의 일치 패턴](https://linux55.com/image/128513/Perl%EC%9D%98%20%EC%9D%BC%EC%B9%98%20%ED%8C%A8%ED%84%B4.png)
다음을 포함하는 입력 파일이 있습니다.
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 변수입니다 .NR
awk