さてさて、ふたたびさとしすのツッコミに対する返答でありまする。
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);
}