17

いくつかの引数を取る Perl スクリプトがあります。次のように実行されます。

exec myscript.pl --file=/path/to/input/file --logfile=/path/to/logfile/logfile.log

スクリプトに次の行があります。

open LOGFILE, ">>$logFilePath" or die "Can't open '$logFilePath': $!\n";

where$logfilePathはコマンド ラインから取得されます。パス /path/to/logfile/ はあるが、logfile.log がない場合は、それを作成するだけです (これが目的のアクションです)。ただし、そのようなパスがないと起動に失敗します。スクリプトを実行する前に存在しない場合、スクリプトにログファイルのパスを作成させるにはどうすればよいですか?

4

2 に答える 2

29

変数にログファイルへのパス (ファイル名が含まれている場合と含まれていない場合がありますlogfile.log) があるとします$full_path。次に、必要に応じて、それぞれのディレクトリ ツリーを作成できます。

use File::Basename qw( fileparse );
use File::Path qw( make_path );
use File::Spec;

my ( $logfile, $directories ) = fileparse $full_path;
if ( !$logfile ) {
    $logfile = 'logfile.log';
    $full_path = File::Spec->catfile( $full_path, $logfile );
}

if ( !-d $directories ) {
    make_path $directories or die "Failed to create path: $directories";
}

これで、ファイル$full_pathへのフル パスが含まれlogfile.logます。パス内のディレクトリ ツリーも作成されます。

于 2012-08-21T09:26:17.220 に答える
7

更新: Dave Cross が指摘したようにmkdir、単一のディレクトリのみを作成します。したがって、一度に複数のレベルを作成する場合、これは機能しません。

Perl のmkdirコマンドを使用します。例:

#Get the path portion only, without the filename.
if ($logFilePath =~ /^(.*)\/[^\/]+\.log$/)
{
    mkdir $1 or die "Error creating directory: $1";
}
else
{
    die "Invalid path name: $logFilePath";
}

UNIX コマンドを実行するよりも、perl 独自の機能を使用することをお勧めします。

編集:もちろん、ディレクトリが最初に存在するかどうかも確認する必要があります。-e何かが存在するかどうかを確認するために使用します。これを上記のコードに追加します。

#Get the path portion only, without the filename.
if ($logFilePath =~ /^(.*)\/[^\/]+\.log$/)
{
    if (-e $1) 
    {
        print "Directory exists.\n";
    }
    else
    {
        mkdir $1 or die "Error creating directory: $1";
    }
}
else
{
    die "Invalid path name: $logFilePath";
}
于 2012-08-21T09:22:58.940 に答える