この演算子はファイル名かファイルハンドルを引数として一つとり、
そのファイルについて何かが真かどうかを見る。
引数を省略すると、$_ をテストする。
例外は -t で、STDIN をテストする。
真の場合は 1、偽の場合は '' か、
ファイルが存在しない場合は undefined value を返す。
優先度は論理演算子、関係演算子よりも高いが、数学演算子よりは低い。
演算子の種類は、以下の通りである。
-r ファイルを実効 uid で読むことができる。 -w ファイルに実効 uid で書くことができる。 -x ファイルを実効 uid で実行することができる。 -o ファイルの所有者が実効 uid である。 -R ファイルを実 uid で読むことができる。 -W ファイルに実 uid で書くことができる。 -X ファイルを実 uid で実行することができる。 -O ファイルの所有者が実 uid である。 -e ファイルが存在する。 -z ファイルサイズが 0 である。 -s ファイルサイズが 0 でない(ファイルサイズを返す)。 -f ファイルはプレーンファイルである。 -d ファイルはディレクトリである。 -l ファイルはシンボリックリンクである。 -p ファイルは名前つきパイプ(FIFO)である。 -S ファイルはソケットである。 -b ファイルはブロック特殊ファイルである。 -c ファイルはキャラクター特殊ファイルである。 -u ファイルに setuid ビットがセットされている。 -g ファイルに setgid ビットがセットされている。 -k ファイルに sticky ビットがセットされている。 -t ファイルハンドルが tty にオープンされている。 -T ファイルはテキストファイルである。 -B ファイルはバイナリファイルである。(-T の逆) -M スクリプトの実行を開始した時点でのファイルの古さ(age)(単位は日) -A スクリプトの実行を開始した時点でのファイルのアクセス時間 -C スクリプトの実行を開始した時点でのファイルの inode 変更時間
演算子 -r,-R,-w,-W,-x,-X の判断は、
ファイルのモードとユーザの uid、gid のみによる。
実際に読み/書き/実行できない場合があるかもしれない。
また、スーパーユーザの場合は、
-r,-R,-w,-W は常に 1 を返し、
-x,-X については
ファイルモードにいずれかの実行許可がついていれば 1 を返す。
このため、スーパーユーザが実行するスクリプトにおいて
実際のファイルモードを得るためには、stat() を行うか、
一時的に uid を他のものにセットする必要がある。
while (<>) {
chop;
next unless -f $_; # 特殊ファイルは無視する
...
}
(注意)
-s/a/b/ としても、置換のマイナスをとるわけではない。
-exp($foo) は期待通りに動く。しかし、
マイナスの後に 1 文字しかなければ、ファイルテストであると解釈される。
-T および -B は次のように動作する。
ファイルの最初のブロックについて、あまり出てこない文字
(奇妙なコントロールコード、メタキャラクター)があるかどうか検査する。
もしそれが多ければ(>10%)、バイナリファイルであり、
そうでなければテキストファイルである。
また、最初のブロックにヌルを含むファイルもバイナリとされる。
ファイルハンドルに対して -T や -B を使うと、
最初のブロックの替わりに現在の標準入力バッファが用いられる。
ヌルファイルや、ファイルハンドルをテストする時にファイルが EOF であると、
-T も -B も真を返す。
ファイルテストにおいて `_'(下線)だけからなる
特殊なファイルハンドルを指定すると、
前回のファイルテスト(または stat() )での stat 構造体が用いられ、
システムコールを行わない。
(-t は除く。また、lstat() や -l は
実際のファイルではなくシンボリックリンクの情報を stat 構造体に残すことを
覚えておく必要がある。)
print "Can do.\n" if -r $a || -w _ || -x _; stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; print "Executable\n" if -x _; print "Setuid\n" if -u _; print "Setgid\n" if -g _; print "Sticky\n" if -k _; print "Text\n" if -T _; print "Binary\n" if -B _;