変数に格納されているファイルの最後の数行はどうすれば入手できますか? Linuxの場合、ファイル内にあればtailコマンドを使用します。変数に格納されている最後の数行のファイルを取得
1) How can I do this in perl if the data is in a file?
2) How can I do this if the content of the file is in a variable?
変数に格納されているファイルの最後の数行はどうすれば入手できますか? Linuxの場合、ファイル内にあればtailコマンドを使用します。変数に格納されている最後の数行のファイルを取得
1) How can I do this in perl if the data is in a file?
2) How can I do this if the content of the file is in a variable?
ある程度は、ファイルの大きさと必要な行数によって異なります。それがメモリに大量に読み込むためには、ファイルの最後の部分を読み取るよりも時間がかかりますので、非常に大きくなる場合は注意する必要があります。
小さい場合。最も簡単な方法は、おそらくFile::Slurp
をメモリに、split
をレコード区切り文字で、最後のn個のレコードを保持することです。実際には、次のようなものがあります。
ファイルシステムの操作を大きくすると、ファイルシステム操作を直接使用する方がよい場合があります。私がこれをしたとき、私はファイルを開き、seek()
を使い、ファイルの最後の4kを読んで、必要なレコードの数を得るのに十分なデータが得られるまで後方に繰り返しました。
詳細な回答ではありませんが、質問はより具体的なタッチになる可能性があります。
ファイルの最後を読み取るには、ファイルの末尾付近の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ハンドルを与えます。
File::ReadBackwards
CPANのモジュールはおそらくあなたが望むものです。このように使用することができます。それも非常に、メモリでかなり効率的でなければなりませんので、内部的には、それは、ファイルの終わり近くに()Sを追求し、行末を探し
use File::ReadBackwards
my $bw = File::ReadBackwards->new("some_file");
print reverse map { $bw->readline() } (1 .. 3);
:これは、ファイル内の最後の3行を出力します大きなファイル。
これは古い質問ですが、最初のファイルと最後の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;