-X EXPR
-X
-X
は以下のオプションで、ファイルテストを行うための演算子です。
演算子には以下のものがあります。
演算子 | 説明 |
---|---|
-r | 読み込み可能 |
-w | 書き込み可能 |
-x | 実行可能で |
-o | 実行者とファイルの所有者が同一 |
-R | 実uid/gidで読み込み可能 |
-W | 実uid/gidで書き込み可能 |
-X | 実uid/gidで実行可能 |
-O | 実uidとファイルの所有者が同一 |
-e | ファイルが存在する |
-z | ファイルサイズが 0 |
-s | ファイルサイズが 0 以外(大きさを返す) |
-f | ファイルは通常ファイル |
-d | ファイルはディレクトリ |
-l | ファイルはシンボリックリンク |
-p | ファイルは名前付きパイプ |
-S | ファイルはソケット |
-b | ファイルはブロック型の特殊ファイル |
-c | ファイルはキャラクタ型の特殊ファイル |
-t | ファイルハンドルが tty としてオープンされている |
-u | ファイルの setuid ビットがセットされている |
-g | ファイルの setgif ビットがセットされている |
-k | ファイルの sticky ビットがセットされている |
-T | ファイルがテキストファイル |
-B | ファイルがバイナリファイル |
-M | perl起動時における、ファイルの更新時刻からの日数 |
-A | perl起動時における、ファイルの参照時刻からの日数 |
-C | perl起動時における、ファイルの作成時刻からの日数 |
上記の単項演算子は、ファイル名かファイルハンドルを引数として動作し、"真"であるか否かを判定した結果を返します。引数が省略されると、-t
ではSTDIN
を調べますが、その他は$_
を調べます。特に記述されていなければ、"真"として 1、"偽"として空文字、ファイルが存在しなければ、未定義値を返します。
ファイルテスト演算子の使い方
$file = "/home/httpd/html/index.html"; # ファイルが存在するか確認 if ( -e $file ){ .... }
ローカルファイルシステムのスーパーユーザには、-r
、-R
、-w
、-W
に対して、常に 1 が返り、モード中のいずれかの実行許可ビットが立っていれば、-x
、-X
にも 1 が返ることにも注意してください。スーパーユーザが実行するスクリプトでは、ファイルのモードを調べるためには、stat
を行なうか、実効uid
を一時的に別のものにする必要があるでしょう。
-T
と-B
は、ファイルの最初の数ブロックを調べて、変わった制御コードや上位ビットがセットされているような、通常のテキストには現れない文字を探します。そのような文字が、多く(30%以上) 見つかるようであれば、そのファイルは-B
ファイルであると判断され、それほど見つからなければ、-T
ファイルとなります。最初のブロックにヌル文字が含まれるファイルも、バイナリファイルとみなされます。-T
や-B
をファイルハンドルに対して用いると、最初のブロックを調べる代わりに、標準入出力バッファを調べます。調べたファイルの中身が何もないときや、ファイルハンドルを調べたときにEOF
に達していたときには、-T
も-B
も"真"を返します。
どのファイルテスト (もしくは、stat
やlstat
) 演算子にも、下線だけから成る特別なファイルハンドルを与えると、前回のstat
構造体が使われ、システムコールを省きます (-t
には使えませんし、lstat
や-l
は実ファイルではなく、シンボリックリンクの情報をstat
構造体に残します)。
print "読み込み可\n" if -r _;