ファイルテスト

ファイルテストを使うと、ファイルに関する情報を取得することができる。

-r  ファイルがこの実行ユーザーまたはグループから読み出し可能
-w  ファイルがこの実効ユーザーまたはグループから書き込み可能
-x  ファイルがこの実行ユーザーまたはグループから実効可能
-o  ファイルをこの実行ユーザーまたはグループが所有している

-R  ファイルがこの実ユーザーまたはグループから読み出し可能
-W  ファイルがこの実ユーザーまたはグループから書き込み可能
-X  ファイルがこの実ユーザーまたはグループから実効可能
-O  ファイルをこの実ユーザーまたはグループが所有している

これらのファイルテストは、ファイルのパーミッションビットというものを見て、何が許可されているかを調べる。ただし、許可されているということと、実際にそれができるかどうかは別。CD-ROM上のファイルに対して、-wが真になることもあるが、実際には書き込めない。
後、実行ユーザーと実ユーザーの違いが良くわからない。参考書によると、setuidやsetgidの状態で実行した時に違いが出る、とあるので、通常は気にする必要はないと思うが。
ちなみに、ディレクトリもファイルの一種。

-M  最後に変更されてからの日数
-A  最後にアクセスされてからの日数
-C  最後にiノードが変更されてからの日数

これらが返す日数は浮動小数点数で、人間が数える日数とは違う。
iノードには、ファイルの内容以外のファイルに関する情報が全て含まれている。

-T  このファイルはテキストファイルのようである
-B  このファイルはバイナリファイルのようである。

「ようである」というのがポイント。Perlは、そのファイルの最初の数千バイトを調べて、変わった制御コードや上位ビットがセットされているような文字がたくさん見つかると、バイナリファイルと判断する。だから、テキストファイルにそういう文字が多く含まれていると、Perlはバイナリファイルだと勘違いするらしい。
また、ファイルが存在しないか、空の場合は、どちらも真を返す。


とりあえず試してみる。

#!/usr/bin/perl
use strict;
use warnings;

my $file = "io.pl";

print "$fileは既に存在しています。\n" if -e $file;

print "$fileは読み出し可能です。\n" if -r $file;
print "$fileは書き込み可能です。\n" if -w $file;
print "$fileは実行可能です。\n" if -x $file;

print "$fileの大きさは", -s $file, "byteです。\n";

print "$fileは最後に変更されてから",
      -M $file, "日経っています。\n";

print "$fileはバイナリファイルのようです。\n" if -B $file;
print "$fileはテキストファイルのようです。\n" if -T $file;
io.plは既に存在しています。
io.plは読み出し可能です。
io.plは書き込み可能です。
io.plは実行可能です。
io.plの大きさは236byteです。
io.plは最後に変更されてから1.35060185185185日経っています。
io.plはテキストファイルのようです。


ファイルテストに与えるファイル名やファイルハンドルを省略すると、$_に入っている値を使う。その時は、ファイルテストの後ろにあるものが、引数に見えないように注意。

my $file_size1 = -s / 1000; # スラッシュを正規表現の開始と勘違い
my $file_size2 = (-s) / 1000; # これは問題なし


UNIXを知らないせいか、よくわからない部分がある。Perlをやるなら、そのうちUNIXもやらないと。