如何将输出文件保存在目录中并打印输出文件的名称?

时间:2013-04-22 04:53:08

标签: perl bash unix sudo file-handling

我正在解析一个文件,然后我从中创建多个输出文件。我想将输出文件保存在执行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.

我的代码不起作用。

2 个答案:

答案 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脚本。这将更容易和方便。