『初めてのPerl』第12章 ファイルテスト

ファイルテスト演算子(読み・書き・実行・存在):

#!/usr/bin/env perl
use v5.12;
use warnings;

# コマンドラインに指定されたファイル名のリストを受け取って、それぞれについて、
# 読み出し可能か、書き込み可能か、実行可能か、又は存在しないか、を表示するプログラム

foreach (@ARGV) {
    say "file: $_";
    if (-r) { # ファイルが読み込み可能か
        say "readable";
    } else {
        say "not readable";
    }

    # 同じファイルに対する2回め以降のファイルテストでは、
    # 「_」を使うと1回めに取得した結果を再利用するので、パフォーマンスが良くなる
    if (-w _) { # ファイルが書き込み可能か
        say "writable";
    } else {
        say "not writable";
    }
    if (-x _) { # ファイルが実行可能か
        say "executable";
    } else {
        say "not executable"
    }
    if (-e _) { # ファイルが存在するか
        say "exists";
    } else {
        say "not exists";
    }
    print "\n";
}

最終更新日時:

#!/usr/bin/env perl
use v5.12;
use warnings;

# コマンドラインに指定されたファイル名のリストを受け取って、
# そのうち最も古いファイルの名前とその古さを日数単位で表示するプログラム

die "No file names supplied!\n" unless @ARGV;
my $oldest_name = shift @ARGV;
my $oldest_age = -M $oldest_name; # -M でファイルの最終更新日を取得

foreach (@ARGV) {
    my $age = -M;
    ($oldest_name, $oldest_age) = ($_, $age)
        if $age > $oldest_age;
}

printf "The oldest file was %s, and it was %.1f days old.\n", $oldest_name, $oldest_age;

ファイルテスト演算子を重ねて使う(Perl v5.10以上):

#!/usr/bin/env perl
use v5.12;
use warnings;

say "Looking for my files that are readable and writable";
die "No files specified!\n" unless @ARGV;

foreach my $file ( @ARGV ) { # -o:所有している
    say "$file is readable and writable" if -o -r -w $file;
}