電子書籍の厳選無料作品が豊富!

for(;;){
$elapse = -M "test.txt";
print $elapse;
print "\n";
if($elapse >= 0.5){
unlink("test.txt");
exit;
}
sleep 1;
}

ファイルの最終更新からの経過時間を監視して、最終更新時間より12時間経過したら自動で削除するプログラムなのですが、常に同じ時間が表示されてしまいます。
何故、このような挙動になるのでしょうか?
また、どのようにすればスマートに経過時間を調べて削除できますか?

質問者からの補足コメント

  • 2行目を
    my $elapse = (time - (stat "shina20190904.csv")[9]) /3600/24;
    に差し替えると思った動作になりました。
    -Mではなぜ失敗するのでしょうか?

      補足日時:2019/09/11 05:44
  • 訂正 shina20190904.csv → test.txt

      補足日時:2019/09/11 05:45

A 回答 (1件)

Perlで疑問があるときは、まずは perldoc を調べてみましょう。




https://perldoc.jp/func/-X
> -M 「スクリプト実行開始時刻から」 ファイル修正時刻を引いたもの(日単位)。
(強調は回答者によるもの)

そのスクリプトでは、実行開始のあと、終了せずにループで繰り返しているので、「スクリプト実行開始時刻」は変化しません。
よって、$elapse が変化するのは、ファイルtest.txtが変化したときだけだし、そのときには >=0.5にはなりません。


https://perldoc.jp/func/stat
でファイル情報を取得し、
https://perldoc.jp/func/time
で得た現在の秒数と比較する、というあたりでしょう。

CPANで探せば、現在からの時間を求められるモジュールがあるかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございます!!!
調べ方も押してくださりありがとうございます。
次回はperldocで検索して質問しようと思います。
とても助かりました。

お礼日時:2019/09/11 13:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!