2011-07-12 24 views

答えて

3

ある程度は、ファイルの大きさと必要な行数によって異なります。それがメモリに大量に読み込むためには、ファイルの最後の部分を読み取るよりも時間がかかりますので、非常に大きくなる場合は注意する必要があります。

小さい場合。最も簡単な方法は、おそらくFile::Slurpをメモリに、splitをレコード区切り文字で、最後のn個のレコードを保持することです。実際には、次のようなものがあります。

ファイルシステムの操作を大きくすると、ファイルシステム操作を直接使用する方がよい場合があります。私がこれをしたとき、私はファイルを開き、seek()を使い、ファイルの最後の4kを読んで、必要なレコードの数を得るのに十分なデータが得られるまで後方に繰り返しました。

詳細な回答ではありませんが、質問はより具体的なタッチになる可能性があります。

5

ファイルの最後を読み取るには、ファイルの末尾付近のseekを読み込みます。例えば、ファイルや行数、あなたが見たいにあるものによっては

open my $fh, '<', $file; 
seek $fh, -1000, 2; 
my @lines = <$fh>; 
close $fh; 

print "Last 5 lines of $file are: ", @lines[-5 .. -1]; 

、あなたは上記の-1000とは異なるマジックナンバーを使用することもできます。あなたは、どちらか

open my $fh, '<', \$the_variable; 
seek $fh, -1000, 2; 

か、単に

open my $fh, '<', \substr($the_variable, -1000); 

を変数と似た何かができる

はあなた$the_variableで最後の1000個の文字を生成I/Oハンドルを与えます。

4

File::ReadBackwards CPANのモジュールはおそらくあなたが望むものです。このように使用することができます。それも非常に、メモリでかなり効率的でなければなりませんので、内部的には、それは、ファイルの終わり近くに()Sを追求し、行末を探し

use File::ReadBackwards 
my $bw = File::ReadBackwards->new("some_file"); 
print reverse map { $bw->readline() } (1 .. 3); 

:これは、ファイル内の最後の3行を出力します大きなファイル。

0

これは古い質問ですが、最初のファイルと最後のk行のパターンを検索する方法を探していました。

seek(ファイルがシーク可能な場合)に加えて、次のように回転バッファを使用するメモリをいくつか保存します(末尾のk行を返します.$k未満の場合は返します)。

my $i = 0; my @a; 
while (<$fh>) { 
    $a[$i++ % $k] = $_; 
} 
my @tail = splice @a,0,$i % $k; 
splice @a,@a,0,@tail; 
return @a; 
関連する問題