最終更新時間から(perlに関して)

[上に] [前に] [次に]
spec-C 1999/11/16(火) 14:15:48
perlに関して教えて頂きたく願います。

あるファイルを参照し(xxx.dat)ファイルが更新されてから
1分以内なら表示、それ以外なら次の処理という動作を行いたいのですが
下記の方法よりスマートというか処理の早い方法がありますでしょうか

if( -M "./xxx.dat" > (0.0007*10) ){
 print "一分以内です\n";
}

よろしくお願いします

ふじ 1999/11/16(火) 15:35:15
全然スマートじゃない別解なら、

if (time - (stat "./xxx.dat")[9] <= 60){
  print "一分以内です\n";
}

どっちが速いかな(^^;
多分似たようなもんでしょうけど・・・

spec-C 1999/11/16(火) 15:38:44
ふじさん有り難うございます。
多分、ふじさんB-cusさんあたりがレスくれると思っていました。
その方法も早速使わせて頂きます。
また宜しくおねがいします。
他の方法もあったら参考にしたいと思いますので、解決チェックはもう少し
先にさせて下さい。 

B-Cus 1999/11/17(水) 00:06:15
わかってるならいいんですが、-M の基準値はスクリプトの
実行開始時間なので、スクリプト中で何回 -M "./xxx.dat" を
調べても値は変化しません。

あと、これもわかってるならいいんですけど (自分でも いまいちだと思ったので
質問してるんでしょうから)、「1分以内」を調べるのに -M を使うのは
ちょっと変です。だって、-M は 日数単位でしょ。1day=60*60*24=86400sec で、
1min=60sec で、60/86400=0.00069444... だから 0.0007、ってこと
なんだろうけど (0.0007*10 って間違ってない? こっちの計算違いかしら)、
誤差出ますよね。やはり stat 使う方が一般的だし、他の人にとっても
読みやすいと思います。

速度については、-M は内部で stat して、$^T からその値を引いて、
さらに 日数単位に変換しなきゃならないんで、-M の方が遅いと思います。
# 計ってないですが。

B-Cus 1999/11/17(水) 00:18:51
補足。ふじさんは
> 全然スマートじゃない別解なら、
とおっしゃっておられますが、僕も同じように書きます。

ただ、[9] ってのがむかつくね〜。C なら
 stat("./xxx.dat",&status);
 if ( time(NULL)-status.st_mtime <= 60 ){
と書けるのに (でいいんだっけ?)。

可読性を良くする ([9]なんて書かなくてすむ) モジュールって ないのかな。

ふじ 1999/11/17(水) 00:51:39
>可読性を良くする ([9]なんて書かなくてすむ) モジュールって ないのかな。
こんなのありました。
Time::localtime
File::stat
#多分標準モジュールだと思う。

# 以下 perldocs Time::localtime より。

SYNOPSIS

use Time::localtime;
printf "Year is %d\n", localtime->year() + 1900;

$now = ctime();

use Time::localtime;
use File::stat;
$date_string = ctime(stat($file)->mtime);

ふじ 1999/11/17(水) 01:00:36
># 以下 perldocs Time::localtime より。
perldoc の間違いです(^^;

B-Cus 1999/11/17(水) 02:10:03
なるほど。
 use File::stat;
 if ( time - stat("./xxx.dat")->mtime <= 60 ){
ですね。ありがとうございます。

[上に] [前に] [次に]