File-ReadBackwards-1.02 > File::ReadBackwards.pm

名前

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, uri@stemsystems.com

著作権(=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.

翻訳者

川合孝典(GCD00051@nifty.ne.jp)