File::Pathでディレクトリを作る
自分には、ちょっと分かりにくかったのでメモ。
use v5.12;
use warnings;
use FindBin qw($Bin);
use File::Path qw(make_path);
# ディレクトリが生成可能なパス
my $path1 = $Bin . '/foo/bar';
# 権限の問題で失敗するであろうパス
my $path2 = '/hoge/fuga';
my $err;
make_path( $path1, $path2, {
    verbose => 1,   # 実行結果の出力
    error => \$err  # エラー情報の取得
});
# エラー情報は、
# ハッシュリファレンスの配列のリファレンスが入っている
if ( @{$err} ) {
    foreach my $diag (@{$err}) {
        my ($file, $message) = %{$diag};
        if ( $file eq '' ) {
            print "general error: $message\n";
        }
        else {
            print "problem unlinking $file: $message\n";
        }
    }
}
実行結果
$ perl aaa.pl
mkdir /Users/(user name)/foo
mkdir /Users/(user name)/foo/bar
mkdir /hoge
mkdir /hoge/fuga
problem unlinking /hoge: Permission denied
problem unlinking /hoge/fuga: No such file or directory
エラーの有無は、デリファレンスした配列で判定する必要がある。
verboseは出す必要はないけど、
エラー情報はdieする前に出力したいところ。
おしまい。
Leave a Comment