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";

从命令行$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";
}

使用 perl 自己的函数比运行 unix 命令更可取。

编辑:当然,您还应该首先检查目录是否存在。用于-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 回答