2016-04-26 5 views
0

ファイルを最後まで読んで、特定の正規表現パターンを含む最後の行を取得する必要があります。私はFile:ReadBackwardsモジュールを持っていません。Windows上の裸のPerlで特定のパターンを含むファイルの最終行を読み取るにはどうすればよいですか?

私は以下のコードを試してみましたが、私はPerlIO::reverseがいずれかのインストールされていないことがわかりました。

モジュールをインストールできません。これを達成するためのコードをお勧めします。

最終的に私は、パターン

(\d\d) (\w{3}) (\d{4}) (\d\d):(\d\d):(\d\d) -- 

で始まるファイルの行は、これは私がいつものように

open my $rev, '<:reverse', '$slogfile'; 

while ($line = <$rev>) { # do to contents reversely  
    print OUTLOG $line if $line =~ m/^(\d\d) (\w{3}) (\d{4}) (\d\d):(\d\d):(\d\d) --/; 
    close($rev); 
} 
+0

あなたがテスト文字列を共有してくださいでした! – AbhiNickz

+0

このように 'close'を使うと' while'ループの反復が最大1回発生します – red0ct

+0

@ red0ctそれを得ました。ループの外側を閉じて使用します。それを指摘してくれてありがとう。 – STJ

答えて

1

読むファイルを試みたものを、自分のパターンでそれぞれの行をテストし、完全な保存されたいですそれが一致するたびに行が表示されます。ファイルが完成したら、保存したものを印刷してください。最後に一致します。

open my $fh, '<', $slogfile; 
my $last_match; 
while (<$fh>) { 
    if (m/^(\d\d) (\w{3}) (\d{4}) (\d\d):(\d\d):(\d\d) --/) { $last_match = $_ } 
} 
print OUTLOG $last_match; 
+0

時間とリソースを消費しないだろうか? – STJ

+0

@STJ入力データによって異なります。 [Benchmark'](http://perldoc.perl.org/Benchmark.html)モジュールから始めて、異なる入力にどれくらいの時間がかかるかを測定することができます。 – red0ct

+0

はい、これは十分に大きくなると遅くなる可能性がありますファイル。その場合は、最後からチャンクを読み込み、破線を再アセンブルする方がよいでしょう。 –

関連する問題