=encoding euc-jp =head1 名前 File::ReadBackwards.pm -- 逆方向に行単位でファイルを読み込みます =head1 概要 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( ) { print ; } =head1 説明 このモジュールはファイルを行単位で逆方向に読み込みます。使い方は簡単で、 メモリの使い方は効率的で高速です。オブジェクトとtieされた ハンドル・インターフェイスの両方をサポートしています。 これは、典型的には最新の要素が追加される、ログやその他の似たような テキスト・ファイルを処理することを意図しています。デフォルトでは、 ファイルはプレーンなテキストであり、OSに対して適切な行区切りを持っている ものと想定します。しかしファイル単位に入力レコード分割文字列を 設定することができます。 =head1 オブジェクト・インターフェース Backwardsオブジェクト・インターフェースでは2つのメソッド、newと readlineだけがあります。(訳者注:他にもメソッドがあるのは以下の通り) =head2 new( $file, [$rec_sep], [$sep_is_regex] ) newはファイル名、オプションのレコード分割子、そしてオプションの 正規表現によりレコード分割子を記述したフラグを引数として取ります。 openに成功したらオブジェクトを返し、失敗したらundefを返します。 $!は、もしあればエラーコードが設定されます。 =head2 readline readlineは引数を取りません。そしてファイルにある前の行を返します。 あるいはファイルにもう行がなければundefを返します。そのファイルが seekできないファイルであれば(例えばパイプ)、undefが返されます。 =head2 eof eodは引数を取りません。readline()がファイル全体まで繰り返されると trueを返します。 =head2 close closeは引数を取りません。そしてハンドルをクローズします。 =head2 tell tellは引数を取りません。そして現在のファイルハンドルの位置を返します。 この値は通常のファイルハンドルを使って、この位置に戻ってくるため seek()に使うことができます。 =head1 tieされたハンドル・インターフェース =head2 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、 その他のサポートされていない操作はしないでください。 =head1 行とレコードの終端 このモジュールは効率のため低レベルのI/Oを必要とするため、 行の終端の変換を管理することなく移植可能な状態でseekしたり、ブロックI/Oを 行うことができません。このモジュールはOSにより使われる通常の行終端文字列の デフォルトのレコード分割子をサポートしています。ファイル単位に分割子を 設定することもできます。 レコード分割子はデフォルトでは正規表現です。これは$/の動きとは違います。 レコード分割子が指定されてB<いない>で、CR/LFがデフォルトである (例えばVMS, redmondware)ときにのみ、それは1つの改行に変換されます。 UnixとMacOSファイル・システムは行の終端に1文字だけを使用し、行は変更されない ままにされます。つまりネイティブなテキストファイルにとっては、行の終端で は何も問題なく行を逆方向に処理することができるはずです。 レコード分割子を指定するのであれば、何も変換されず、バイナリ・モードで それらを読んだときのようにレコードを取得することになるでしょう。 =head1 設計 これはファイルの末尾から大きな(8kb)データのブロックを読み込むことにより 機能します。そしてそれらをレコード分割子で分割し、レコードのリストを オブジェクトに格納します。各readlineの呼び出しでは、そのリストの 一番上のレコードを返し、もしリストが空であれば、ファイルから前のブロックを 読み込み、分割することによって補充します。ファイルの先頭に到達し、もう行が なければundefが返されます。全ての境界の状況は正しく扱われます。例えば (改行がない)不完全な行が後ろ付いているのであれば、返される先頭の行に なり、読込バッファの大きさよりも大きい行も正しく扱われます。 =head1 注意 オブジェクトとtieされたインターフェースのどちらでも、リスト・コンテキストは サポートされていません。もし全ての行を逆方向に配列へ読み込みたい (そしてメモリの使用量について気にしない)のであれば、以下のようにしてください: @back_lines = reverse . このモジュールはファイルを最後から最初まで、一度に1行を読み込むことを 意図しているだけです。 =head1 作者(=AUTHOR) Uri Guttman, uri@stemsystems.com =head1 著作権(=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. =head1 翻訳者 川合孝典(GCD00051@nifty.ne.jp)