这是我的情况:
use strict;
use Cwd;
use Getopt::Long;
Getopt::Long::Configure('pass_through');
use File::Spec;
use File::Basename;
1) -out=/some/place/some_filename.txt
2) -out=/some/place/
3) -out=some_filename.txt
任何用户都可以给出任何"-out=",如上所示。我对路径名感兴趣,因为我必须检查目录是否可写才能创建/覆盖日志文件,如果目录不可写,则退出并发出警告。
如果-out=是选项1,那么fileparse会给我"/some/place",我可以在上面-w。
如果-out=是选项2,那么我可以只使用-d和-w,然后附加一个默认文件名。类似于"/some/place/default_filename.txt">
如果-out=是选项3,我必须将"my$cwd"附加到文件名。类似于"/current/working/dir/some_filename.txt">
请求的文件可能存在,也可能不存在。文件名可能是.log、.txt或.dat,也可能根本没有扩展名,这取决于用户的喜好,我必须根据需要创建/覆盖该文件。
因此,我的问题是,对于这里更有经验的Perl战术家来说,由于-out=在不同用户之间是不确定的,提取路径名的最佳方法是什么?我可以做"if(-d$out)",但如果用户只提供了一个文件名呢?我可能很幸运,用户可能会给出完整的路径/文件名,或者只是目录路径。或者,用户可能对当前工作目录中的数据感到满意,并且只提供文件名。我在fileparse中插入了一个文件名,得到:"$path=./">
罗德里克
您只需检查参数是否为目录(-d $out
),并在这种情况下为其添加默认文件名。然后,您只需要检查生成的文件是否可写,如果不可写则退出:
$out .= "/default_filename.txt" if -d $out;
die "File $out is not writable!" unless -w $out;
# everything ok, create file at $out:
open FILE, ">", $out or die "Cannot open $out for writing!";
# ...