いくつかの引数を取る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";
どこ $logfilePath
はコマンドラインから取得されます。パス/ path/to/logfile /はあるが、logfile.logがない場合は、それを作成するだけです(これは望ましいアクションです)。ただし、そのようなパスがない場合、起動に失敗します。スクリプトを実行する前に存在しないログファイルのパスをスクリプトに作成させるにはどうすればよいですか?
変数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
ファイルへの絶対パスが含まれるようになります。パスのディレクトリツリーも作成されます。
更新: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";
}