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