2009-07-24 2 views
3

Perl을 사용하여 로그 구문 분석 스크립트를 작성하고 있습니다. 로그 파일을 다음과 같이 읽었습니다.Perl의 루프 내에서 파일을 읽는 중 마지막 행인지 어떻게 알 수 있습니까?

open(LOGFILE, "$logFile") || die "Error opening log file $logFile\n";       
while(<LOGFILE>) 
{ 
    #Processing statements goes here. 
} 

이제 처리중인 문장에서 파일 읽기 포인터가 마지막 줄에 있는지 확인하고 싶습니다. 그렇다면 종료하기 전에 조건을 처리하려고합니다.

그래서 한 줄씩 파일을 읽는 데 사용되는 while 루프 내에서 문제가 발생합니다. 마지막 줄에 있는지 어떻게 알 수 있습니까?

+0

Is 파일에서 줄 수를 계산할 때까지 유일한 방법은 마지막 줄에 도달? – Viky

+0

while 루프가 종료 된 직후 처리를 수행 할 수 없습니까? 그런 다음 마지막 줄을 처리했습니다. – dave

+0

@dave. 그렇지 않아. 마지막 행에서 로그 파일을 읽는 정보를 처리하려고하는 경우. – Viky

답변

10

다른 모든 행을 사용하지 않으면 매우 비효율적입니다.

+0

@butterchicken. 감사. "print $ last = $ _ if eof;"시도했습니다. " 파일의 마지막 행을 인쇄 할 수 있습니다. – Viky

+0

@butterchicken. 나는 이것을 평범한 경우에 사용할 수 있습니까? 같은 문자가 인 경우 (eof를 확인) – Viky

+0

+1. @butterchiken. if (eof)가 잘 작동하면. 회신 해 주셔서 감사합니다. – Viky

6

마지막 줄만 신경 쓰는 사람은 File::ReadBackwards입니다. 관심 항목이 끝나는 로그 파일 및 상황에 맞게 특별히 설계되었습니다.

해당 모듈을 설치하면, 당신은 아주 쉽게 (오히려 찾을 때까지 전체 파일을 통해가는 것보다) 마지막 줄을 팝업 할 수

#!/usr/bin/env perl 
use strict; 
use warnings; 
use File::ReadBackwards; 

my $fh = File::ReadBackwards->new('dir_walk.rb') 
    or die "Can't read 'dir_walk.rb': $!"; 

my $last_line = $fh->readline; 

print $last_line; 

편집 : 것은 가치가 무엇인지, I 이 아닌 경우 전체 파일을 살펴보고 싶을 때만 권장합니다. 즉, 어떤 파일이든 상관없이 전체 파일을 읽으 려한다면이 파일이 아마도 최상의 솔루션이 아닐 것입니다. (마지막 줄의 특정 항목 만 확인할지 또는 로그의 나머지 부분에도 관심이 있는지 여부를 묻는 질문에서 확실하지 않습니다.)

+0

+1 그는 어쨌든 전체 파일을 처리하고 마지막 줄을 특별히 처리하려고한다고 믿습니다. 작은 파일의 경우 중요하지 않지만 뒤로 이동하면 성능에 영향을 줄 수 있습니다. –

+0

@Sinan : 그가 전체 로그를 처리했는지 여부를 알 수 없었습니다. 나는 그가 전체 파일을 다루고 싶다면 이것이 최선의 해결책이 아니라고 생각하는 경향이있다. 그 효과에 메모를 추가하겠습니다. – Telemachus

+0

@Telemachus 1 MB 파일로 시도해 보았습니다 ... 전혀 큰 차이가 없었습니다. 그런 다음 80MB 파일로 2 초에서 10 초 사이에 시도했습니다. ;-) –