【问题标题】:perl open file error handlingperl 打开文件错误处理
【发布时间】:2017-02-26 20:10:54
【问题描述】:

当文件没有在下面的 Perl 程序中打开时,我想做一些任务。但是当我运行它时,我遇到了语法错误。它有什么问题?

my $LOGPATH = $ENV{DATA_OU};
my $LOGFILE =  "cdj_rep" . "." . "test" . ".rpt";

if ! (open(OUT,">$LOGPATH/test1/work/$LOGFILE")) {
   print "testin";
   return;  
}

close(OUT);

【问题讨论】:

    标签: perl


    【解决方案1】:

    我会这样写

    my $LOGPATH = $ENV{DATA_OU};
    my $LOGFILE = "cdj_rep.test.rpt";
    my $path    = "$LOGPATH/test1/work/$LOGFILE";
    
    open my $fh, ">", $path or do {
      warn "$0: open $path: $!";
      return;
    };
    
    close $fh or warn "$0: close $path: $!";
    

    将整个路径放在$path 中,这样您就不必重复多次,如果您需要更改它,可以在一个地方进行。

    open 的调用使用词法文件句柄 (my $fh) 而不是裸字句柄。这是一个需要养成的好习惯,因为将 $fh 传递给 subs 或将其填充到数据结构中往往在语法上更自然。

    它还使用 open 的 3 参数形式,因此您不必担心路径中的字符会被特殊解释。就您的代码而言,这似乎没什么大不了的,但这是另一个需要养成的好习惯。

    检查open 是否成功的常用习语是

    open my $fh, "<", $path
      or die "$0: open $path: $!";
    

    使用if (!open ...unless (open ... 会很好,但是使用词法文件句柄,您需要担心范围问题。您似乎将检查用作警卫,因此编写 open or ... 会将文件句柄留在成功时的范围内。如果失败,您希望执行两条语句,因此您需要将它们包装在do { ... } 中,如上。

    还要注意传递给warn的错误信息内容:

    • 出现错误的程序 ($0)
    • 它试图做什么 (open $path)
    • 以及失败的原因 ($!)

    warndie 运算符将它们的输出发送到标准错误,这样可以灵活地将错误消息重定向到其他地方。

    最后,当您close 为您创建的要写入或追加的文件的句柄时,您应该检查它是否失败,例如发生 I/O 错误时可能会发生这种情况。

    【讨论】:

    • Schwern 说我们应该使用autodie
    • +1:写得很好,推荐更新、更好的 Perl 开放技术。
    • 感谢您对 $0 和 $ 的关注!内置变量。对我这样的新手非常有用。另外,使用大写 FILE_HANDLES 不是惯例吗?
    • @SidSarasvati 在 Perl 中使用大写裸字 FILE_HANDLES 是过时的并且有几个缺点,例如,它们是全局范围的并且难以存储在数据结构或作为参数传递。请使用词法文件句柄。
    【解决方案2】:

    !需要进入括号内:

    if (! open (out,
    

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多