我想在下面的Perl程序中打开文件时执行一些任务.但是当我运行它时,我会遇到语法错误.它出什么问题了?
my $LOGPATH = $ENV{DATA_OU};
my $LOGFILE = "cdj_rep" . "." . "test" . ".rpt";
if ! (open(OUT,">$LOGPATH/test1/work/$LOGFILE")) {
print "testin";
return;
}
close(OUT);
Run Code Online (Sandbox Code Playgroud)
Gre*_*con 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: $!";
Run Code Online (Sandbox Code Playgroud)
放置整个路径,$path这样您就不必多次重复,如果您需要更改它,您可以在一个地方完成.
调用open使用词法文件句柄(my $fh)而不是裸字句柄.这是一个很好的习惯,因为$fh在数据结构中传递给subs或填充它往往在语法上更自然.
它还使用3参数形式,open因此您不必担心特殊解释路径中的字符.在您的代码中,它可能看起来不是什么大问题,但它是开发的另一个好习惯.
检查是否open成功的常用习语
open my $fh, "<", $path
or die "$0: open $path: $!";
Run Code Online (Sandbox Code Playgroud)
使用if (!open ...或unless (open ...将会很好,但使用词法文件句柄,您需要担心范围问题.您似乎将检查用作保护,因此写入open or ...会将文件句柄留在范围内,以便它成功.如果失败则需要执行两个语句,因此需要将它们包装在do { ... }上面.
另请注意传递给的错误消息的内容warn:
$0)open $path)$!)的warn和die运营商发送其输出到标准错误,这允许其他地方重定向错误消息的灵活性.
最后,当您close处理要创建的文件以进行写入或追加时,应检查它是否失败,例如,如果发生I/O错误,可能会发生这种情况.