名前¶
File::ReadBackwards.pm -- 逆方向に行単位でファイルを読み込みます
概要¶
use File::ReadBackwards ;
# オブジェクト・インターフェース
$bw = File::ReadBackwards->new( 'log_file' ) or
die "can't read 'log_file' $!" ;
while( defined( $log_line = $bw->readline ) ) {
print $log_line ;
}
# ... あるいは、もう一つの読み込み方法
until ( $bw->eof ) {
print $bw->readline ;
}
# tieされたハンドル・インターフェース
tie *BW, 'File::ReadBackwards', 'log_file' or
die "can't read 'log_file' $!" ;
while( <BW> ) {
print ;
}
説明¶
このモジュールはファイルを行単位で逆方向に読み込みます。使い方は簡単で、 メモリの使い方は効率的で高速です。オブジェクトとtieされた ハンドル・インターフェイスの両方をサポートしています。
これは、典型的には最新の要素が追加される、ログやその他の似たような テキスト・ファイルを処理することを意図しています。デフォルトでは、 ファイルはプレーンなテキストであり、OSに対して適切な行区切りを持っている ものと想定します。しかしファイル単位に入力レコード分割文字列を 設定することができます。
オブジェクト・インターフェース¶
Backwardsオブジェクト・インターフェースでは2つのメソッド、newと readlineだけがあります。(訳者注:他にもメソッドがあるのは以下の通り)
new( $file, [$rec_sep], [$sep_is_regex] )¶
newはファイル名、オプションのレコード分割子、そしてオプションの 正規表現によりレコード分割子を記述したフラグを引数として取ります。 openに成功したらオブジェクトを返し、失敗したらundefを返します。 $!は、もしあればエラーコードが設定されます。
readline¶
readlineは引数を取りません。そしてファイルにある前の行を返します。 あるいはファイルにもう行がなければundefを返します。そのファイルが seekできないファイルであれば(例えばパイプ)、undefが返されます。
eof¶
eodは引数を取りません。readline()がファイル全体まで繰り返されると trueを返します。
close¶
closeは引数を取りません。そしてハンドルをクローズします。
tell¶
tellは引数を取りません。そして現在のファイルハンドルの位置を返します。 この値は通常のファイルハンドルを使って、この位置に戻ってくるため seek()に使うことができます。
tieされたハンドル・インターフェース¶
tie( *HANDLE, 'File::ReadBackwards', $file, [$rec_sep], [$sep_is_regex] )¶
TIEHANDLE, READLINE, EOF, CLOSEそしてTELLメソッドは、それぞれ new, readline, eof, close そして tellメソッドの別名です。そこで これらの引数とAPIについては、そちらをご覧ください。ハンドルを 一旦File::ReadBackwardsにtieさせれば、許されるI/O操作は前の行を 読み込む<>だけになります。tieされたハンドルにeof()とclose()を 呼ぶこともできます。そのほかのtieされたハンドルの操作は未知のメソッド (=unknown method)エラーになります。tieされたハンドルへのseek、write、 その他のサポートされていない操作はしないでください。
行とレコードの終端¶
このモジュールは効率のため低レベルのI/Oを必要とするため、 行の終端の変換を管理することなく移植可能な状態でseekしたり、ブロックI/Oを 行うことができません。このモジュールはOSにより使われる通常の行終端文字列の デフォルトのレコード分割子をサポートしています。ファイル単位に分割子を 設定することもできます。
レコード分割子はデフォルトでは正規表現です。これは$/の動きとは違います。
レコード分割子が指定されていないで、CR/LFがデフォルトである (例えばVMS, redmondware)ときにのみ、それは1つの改行に変換されます。 UnixとMacOSファイル・システムは行の終端に1文字だけを使用し、行は変更されない ままにされます。つまりネイティブなテキストファイルにとっては、行の終端で は何も問題なく行を逆方向に処理することができるはずです。 レコード分割子を指定するのであれば、何も変換されず、バイナリ・モードで それらを読んだときのようにレコードを取得することになるでしょう。
設計¶
これはファイルの末尾から大きな(8kb)データのブロックを読み込むことにより 機能します。そしてそれらをレコード分割子で分割し、レコードのリストを オブジェクトに格納します。各readlineの呼び出しでは、そのリストの 一番上のレコードを返し、もしリストが空であれば、ファイルから前のブロックを 読み込み、分割することによって補充します。ファイルの先頭に到達し、もう行が なければundefが返されます。全ての境界の状況は正しく扱われます。例えば (改行がない)不完全な行が後ろ付いているのであれば、返される先頭の行に なり、読込バッファの大きさよりも大きい行も正しく扱われます。
注意¶
オブジェクトとtieされたインターフェースのどちらでも、リスト・コンテキストは サポートされていません。もし全ての行を逆方向に配列へ読み込みたい (そしてメモリの使用量について気にしない)のであれば、以下のようにしてください:
@back_lines = reverse <FH>.
このモジュールはファイルを最後から最初まで、一度に1行を読み込むことを 意図しているだけです。
作者(=AUTHOR)¶
Uri Guttman, [email protected]
著作権(=COPYRIGHT)¶
Copyright (C) 2003 by Uri Guttman. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
翻訳者¶
川合孝典([email protected])