[perlメモ] -Mの使い方の具体例

ファイルの情報を取得するstat関数のメモでファイルテストの「-M」についてふれました。使い方は簡単ですが、割と書き方を忘れやすいので具体的な例記録しておきます。ファイルテストについては、下のページを参考にしてください(英語)、日本語ならその下のとほほ様のページを参照してください。

◇参考:NAME function – search.cpan.org
http://search.cpan.org/~nwclark/perl-5.8.9/pod/perlfunc.pod#X

◇参考:とほほのperl入門(概要編)
http://www.tohoho-web.com/wwwperl1.htm#FileTest

で、具体例ですが、下の様なサンプルを書いてみた。ファイルテスト「-M」はファイルの更新時刻とプログラムが起動時の時刻の間が何日経っているかを返すので、実際にプログラムで表示してみたところ。

テスト用に、作ったばかりのファイル「aaa.txt」とても古いファイル[bbb.txt]を用意した。

my $mmm = -M "aaa.txt";

print "—aaa.txt\n";
print "ファイルが作成されてから $mmm 日\n";
print "ファイルが作成されてから ".($mmm*86400)." 秒\n";

if(((-M "aaa.txt")*86400) >= 3600){
    print "1時間以上\n";
}else{
    print "1時間未満\n";
}

$mmm = -M "bbb.txt";

print "—bbb.txt\n";
print "ファイルが作成されてから $mmm 日\n";
print "ファイルが作成されてから ".($mmm*86400)." 秒\n";

if(((-M "bbb.txt")*86400) >= 3600){
    print "1時間以上\n";
}else{
    print "1時間未満\n";
}

実際に実行してみたのが下、aaa.txtの方は作成されたばかりのファイルなので、「0.0192824074074074 日」という結果になっている。戻り値が日単位なので1日に満たない部分は小数点としてあらわされる。

そういうわけで、秒に直したい場合は、1日24時間の秒数である86400秒を掛けてあげることで秒数にすることができる。

結果、「1666秒」となっています。

bbb.txtの方は1年前以上に更新されたファイルなので「462.950011574074 日」なんてことになっています。

F:\tmp>perl test_M.pl
—aaa.txt
ファイルが作成されてから 0.0192824074074074 日
ファイルが作成されてから 1666 秒
1時間未満
—bbb.txt
ファイルが作成されてから 462.950011574074 日
ファイルが作成されてから 39998881 秒
1時間以上

F:\tmp>

あと、if文でファイルが1時間以内に作成されたかどうかを表示しています。-Mの結果を秒数に変換した後、1時間の秒数である3600と比べているだけです。秒数を変更すればどんな時間にも対応できますね。

どういうときに使うかというと、一定時間経過したファイルを削除したいとか、新しい内容で上書きしたいとか、そういう制御をしたいときに便利なわけです。

あと、注意点としては、一瞬動かすタイプのcgiなどではこれで問題ないですが、プロセスとして常駐するタイプのプログラムにした場合、-Mはプログラム起動時の時刻を基準に日数を返すので、正しい値が取得できなくなることが予測されます。cgiなどのように毎回一瞬動くタイププログラムであれば問題ありませんが、常駐するタイプのプログラムの場合はstat関数を使うべきだと思います。

タグ : ,