Practice of Programming

プログラム とか Linuxとかの話題

ファイルテスト演算子 -M -A -C には基準の時間がある

ファイルテスト演算子 -M はファイルが作成されてからの日数を返す。
86400かけてやれば、秒数になる。

print 86400 * (-M $file);

で、File::Findをループで回して、ファイルが変更されたら云々という処理に使おうかと思ったのだが、うまくいかない。次のscriptは、同じ値がずっと表示されてしまい、変更するとマイナスになるが、その値も以後変わらない。

$|=1;
while(1) {
  sleep 1;
  print 86400 * (-M $file), "\n";
}

なんか基準の時間があるっぽいなぁと思って、ラクダ本を調べたところ、p.116に書いてた。
-M -A -C はスクリプトが実行された時間($^T)を基準にしているということだ。
なので、$^T = time してやればいいとのこと。

$|=1;
while(1) {
  local $^T = time;
  sleep 1;
  print 86400 * (-M $file), "\n";
}

これで、望みどおりになります。

もしくは、代わりに、statを使って、time - (stat $file)[9] を使えばいいですね。