Fri Feb 18, 2005 [長年日記]

#1 [電脳] Perlのお勉強

さてさて、ふたたびさとしすのツッコミに対する返答でありまする。

1)for(;;){while(){.;..;..;}sleep 1;seek IN,0,1;}で、最終行まで読んで処理して、他プロセスでファイルが伸びたらそれも処理する、という動作ができるそうです。ファイルポインタ管理は Perlにおまかせということで。(Cライブラリの「標準度」によっては不可の事もあるらしい)
2)標準モジュールあるからselectよりもこっちを使ってとPerlの一番偉い人は言っているらしい(下位互換性気になるなら不可)
3)ログの安全性から見ると「コピーしてから0にする」ほうが良いですね。そうか、inode変わらないのか。サイズでみるという事は、for (;;){open IN $infile;$size=(stat(IN))[7];for(;;){...;last if($size > (stat($infile))[7];}}なのかな?

1)は確かに書いてる通りですね。このコーディングならファイルサイズをまったく意識する必要無しってことですね。Perlならではの書き方だと思います。

2)は書き方の問題だけですが、ソースの可読性というのは重要なことで、$|=1 なんて書かれるよりは autoflush(1) と書いた方が、読んで意味が判りやすいってのはありますね。

3)はログの安全性と言うよりは、ログを吐くプログラムの作りに依存するところが大きいです。何かのトリガでログファイルの close()/open() してくれるならいいんですが、何も考えて無いとオープンしっぱなしなので、ログを切替えるにはファイルサイズを切り詰めるしか、ログファイルを小さくする手段が無い... というわけで。

で、対処方法ですが、

    for (;;)
    {
        open(IN, "< $infile");
        for (;;)
        {
            while (<IN>)
            {
                ...;
                $size=tell(IN);
            }
            last if($size > (stat($infile))[7]);
            sleep(1);
            seek(IN, 0, 1);
        }
        close(IN);
    }
動かしてみてはいないですが、こんな感じですかね? 上手く読めた時のポインタを覚えておいて、失敗した時のファイルサイズと比較して、読めた時の方が大きければ、ファイルが切り替わったという判断をするって感じですが。
[]

«前の日記(Mon Jan 31, 2005) 最新 次の日記(Tue Mar 01, 2005)»