我想在下面的Perl程序中打开文件时执行某项任务。但是当我运行它时,我会遇到语法错误。怎么了?
my $LOGPATH = $ENV{DATA_OU};
my $LOGFILE = "cdj_rep" . "." . "test" . ".rpt";
if ! (open(OUT,">$LOGPATH/test1/work/$LOGFILE")) {
print "testin";
return;
}
close(OUT);
答案 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
)$!
) warn
和die
运算符将其输出发送到标准错误,这样可以灵活地将错误消息重定向到其他位置。
最后,当您close
处理您创建的要写入或附加的文件时,应该检查它是否失败,例如,如果发生I / O错误,可能会发生这种情况。
答案 1 :(得分:9)
!需要进入括号内:
if (! open (out,