-X

ファイルテスト演算子

構文

解説

-X はファイルテスト演算子のことを指し、X の部分は下表のアルファベットに置き換えることで、 さまざまなファイルテストの機能が提供されます。 次のコードは、-e を使ってファイルの有無をチェックし、 ファイルが存在していれば、-s を使ってファイルサイズを出力します。

my $file = './sample.txt';
if ( -e $file ) {
    my $size = -s $file;
    print "${file} のサイズは ${size} バイトです。\n";
}

上記コードでは -X の後ろにファイルパスを指定しましたが、 ここにはファイルハンドルやディレクトリハンドルを指定することもできます。

my $file = './sample.txt';
open my $fh, '<', $file;
if ( -e $fh ) {
    my $size = -s $fh;
    print "${file} のサイズは ${size} バイトです。\n";
}

もしファイルパスやファイルハンドルやディレクトリハンドルを省略したら、 その場合は $_ が適用されます (STDIN をテストする -t はその限りではありません)。

ファイルテスト演算子は一部の例外を除いて、真なら 1 が、偽なら空文字列が返されます。 もしファイルが存在しなかったなどの理由でファイルテスト自体が完了しなかった場合は undef を返し、 $! にエラーメッセージがセットされます。

利用可能なファイルテスト演算子は下表の通りです。

演算子 説明
-r ファイルが実効 uid/gid によって読み取り可能かどうかをテストする。
-w ファイルが実効 uid/gid によって書き込み可能かどうかをテストする。
-x ファイルが実効 uid/gid によって実効可能かどうかをテストする。
-o ファイルが実効 uid によって所有されているかをテストする。
-R ファイルが実 uid/gid によって読み取り可能かどうかをテストする。
-W ファイルが実 uid/gid によって書き込み可能かどうかをテストする。
-X ファイルが実 uid/gid によって実効可能かどうかをテストする。
-O ファイルが実 uid によって所有されているかをテストする。
-e ファイルが存在するかどうかをテストする。
-z ファイルが空 (サイズがゼロ) かどうかをテストする。
-s ファイルが空でないかどうかをテストする(サイズをバイトで返す)。
-f ファイルかどうかをテストする。
-d ディレクトリかどうかをテストする。
-l シンボリックリンクかどうかをテストする。
-p ファイルが名前付きパイプ (FIFO) かどうか、または、ファイルハンドルがパイプかどうかをテストする。
-S ファイルがソケットかどうかをテストする。
-b ファイルがブロックスペシャルファイルかどうかをテストする。
-c ファイルが文字スペシャルファイルかどうかをテストする。
-t ファイルハンドルが tty に開いているかどうかをテストする。
-u ファイルに setuid ビットがセットされているかどうかをテストする。
-g ファイルに setgid ビットがセットされているかどうかをテストする。
-k ファイルに sticky ビットがセットされているかどうかをテストする。
-T ファイルが ASCII または UTF-8 テキストファイルかどうかをテストする。
-B ファイルがバイナリファイルかどうかをテストする(-T の逆)。
-M ファイルの最終更新日時からスクリプト実行開始日時までを日数で返す。
-A ファイルの最終アクセス日時からスクリプト実行開始日時までを日数で返す。
-C i ノード最終変更日時からスクリプト実行開始日時までを日数で返す。

ファイルテスト演算子は一見すると一つの引数を必要とする関数のようにも見えますが、そうではありません。 たとえば、-s でファイルサイズを取得して、それに 1024 を足したいとしましょう。 -s($file) + 1024 のようにカッコでファイルパスを区切ることで期待どおりの計算ができると思うかもしれません。 もしファイルテスト演算子が関数と同じ文法なら正しいかもしれませんが、残念ながらそうではありません。 実はこれは -s ( $file + 1024 ) と同じように扱われてしまい、結果的にエラーになります。 ファイルテスト演算子によって得られた結果を計算式で使いたいなら、演算子とファイルパスの両方をカッコで囲って ( -s $file ) + 1024 とする必要があります。

my $file = './sample.txt';
my $size = ( -s $file ) + 1024;
print $size, "\n";