4

Perlを使用してログ解析スクリプトに取り組んでいます。私は次のようにログファイルを読んでいます:

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

ここで、ステートメントの処理で、ファイル読み取りポインターが最後の行にあるかどうかを確認したいと思います。はいの場合、終了する前に条件を処理します。

したがって、問題は、ファイルを1行ずつ読み取るために使用されているwhileループ内からです。それが最後の行にあるかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

14
my $last;
while(<MYFILE>) {
   $last = $_ if eof;
}

ただし、1 行おきに何かを実行していない限り、これはかなり非効率的です。

于 2009-07-24T09:10:39.393 に答える
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;

編集:価値があるので、ファイル全体を調べたくない場合にのみこれをお勧めします。つまり、何があってもファイル全体を読み取る場合、これはおそらく最善の解決策ではありません。(最後の行の特定の項目のみを確認したいのか、それともログの残りの部分も気にするのか、あなたの質問からはよくわかりません。)

于 2009-07-24T10:45:34.990 に答える