perl打开文件错误处理

时间:2010-07-13 00:24:58

标签: perl

我想在下面的Perl程序中打开文件时执行某项任务。但是当我运行它时,我会遇到语法错误。怎么了?

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

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

close(OUT);

2 个答案:

答案 0 :(得分:13)

我会把它写成

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错误,可能会发生这种情况。

答案 1 :(得分:9)

!需要进入括号内:

if (! open (out,