2014年5月16日金曜日

PerlのFile::Tailでハマった

Perlでtail -fみたいなことがしたくて、File::Tailに辿り着いた。

サンプルを見て書いてみた。けど、何も出力されない…。
use File::Tail;
$file = File::Tail->new(name => "test.txt");

while( defined($line = $file->read)) {

  print "$line";

}
ちょっと調べてみると、マニュアルにmaxintervalなるものがある。
http://search.cpan.org/~mgrabnar/File-Tail-0.99.3/Tail.pm



maxinterval
The maximum number of seconds (real number) that will be spent sleeping. Default is 60, meaning File::Tail will never spend more than sixty seconds without checking the file.

これか。要は60秒ほど待ってしまうわけだ。
さっきのサンプルを動かして、放置しておくと1分経てば出力されていた。

なるほど。

とりあえずすぐ見たいので、maxintervalを1秒に変更すると、更新から1秒後に出力されるようになった。



ただ、本当はファイル全体を読み込んで、かつ、tail -f のようにしたい。

これは
$file->tail(-1);
すれば出来ますよ、みたいなのを見つけてやってみたけど、動かない。

マニュアルに戻ると、tailはnewのargmentsになってるので、以下のように書き換え。

use File::Tail;

$file = File::Tail->new(name => "test.txt", maxinterval => 1, tail => -1) or die("cannot tail test.txt");

while( defined($line = $file->read)) {

  print "$line";

}
ちゃんと動くようになった。