我正在解析一个文件,然后我从中创建多个输出文件。我想将输出文件保存在执行perl脚本的同一文件夹中的特殊目录中。如果该目录已存在,则将文件放在该目录中。如果用户没有sudo权限,则在当前工作目录中创建文件。
use strict; use warnings;
sub main {
my $directory = "pwd/test.pl_output";
unless(mkdir $directory) {
return 0; # unable to create directory (it either already exists
# or you don't have sudo privileges)
} else {
return $directory
}
}
if ( my $PATH = main() ){
open(my $fh, '<', 'input.txt') or die $!;
open(my $output, '+>', $PATH.'/output.txt') or die $!;
} else { # create the output file as usual
open(my $fh, '<', 'input.txt') or die $!;
open(my $output, '+>', 'output.txt') or die $!;
}
print "All done! Please look in \$output\n";
在脚本结束时,在我解析并处理完文件后,我想在shell提示符下打印出以下内容:
All done! Please look in 'output.txt' for the output.
如果输出文件在新目录中,我想打印以下内容:
All done! Please look in 'output.txt' in the directory '~/path/to/output.txt' for the output.
我的代码不起作用。
答案 0 :(得分:3)
您现有的代码存在几个严重问题。一个是你在双引号字符串中使用pwd
。那是行不通的。你可以在反引号中使用pwd
并捕获输出,但不能在双引号文字内。
另一个问题是,代码的逻辑没有达到如何优雅降级目标的描述的复杂性。
以下代码段将首先在可执行文件的目录中查找名为“special”的目录。如果它不存在,它将尝试创建它。如果创建失败(可能是由于权限),接下来将在用户的当前工作目录中查找名为“special”的目录。如果它不存在,它将尝试创建它。如果失败了,它就会以描述性消息消亡。
如果它超过此点,则“特殊”目录要么已预先存在,要么已沿其中一个允许路径创建。接下来,打开文件。如果打开输出文件失败,我们就死了。否则,继续并可能写入文件。然后关闭输入和输出文件。最后,打印可以找到输出文件的路径。
use strict;
use warnings;
use FindBin;
use File::Path qw( make_path );
my $special_dir = 'special';
my $filename = 'my_file.txt';
my $bin = $FindBin::Bin;
my $path;
if( not defined( $path = get_path( "$bin/$special_dir", "./$special_dir" ) ) ) {
die "Unable to find or create a suitable directory for output file.";
}
my $output_filename = "$path/$filename";
open my $in_fh, '<', 'input.txt' or die $!;
open my $out_fh, '+>', $output_filename or die $!;
# Do whatever it is you want to do with $in_fh and $out_fh....
close $out_fh or die $!;
close $in_fh or warn $!;
print "All done! Please look in $output_filename for the output.\n";
sub get_path {
my @tries = @_;
my $good_path;
for my $try_path ( @tries ) {
if( -e $try_path and -d _ and -w _ ) { # Path exists. Done.
$good_path = $try_path;
last;
}
elsif( eval { make_path( $try_path ); 1; } ) { # Try to create it.
$good_path = $try_path; # Success, we're done.
last;
}
}
# Failure; fall through to
# next iteration. If no
# more options, loop ends
# with $path undefined.
return $good_path;
}
我正在使用Perl模块FindBin来查找可执行文件。并且File :: Path用于创建目录。
答案 1 :(得分:0)
过去几次,我发现使用带有Shell脚本的perl脚本可以更好地实现此目的。用于解析的Perl脚本和用于文件夹处理的shell脚本。并且可以使用shell脚本轻松包含perl脚本。这将更容易和方便。