我在执行Perl脚本时遇到此错误.请告诉我如何在Perl中纠正这个错误.
print() on closed filehandle MYFILE
Run Code Online (Sandbox Code Playgroud)
这是给出错误的代码:
sub return_error
{
$DATA= "Sorry this page is corrently being updated...<p>";
$DATA.= "<A href=\"javascript:history.go(-1)\"> Back </A>";
open(MYFILE,">/home/abc/xrt/sdf/news/top.html");
print MYFILE $DATA;
close(MYFILE);
exit;
}
Run Code Online (Sandbox Code Playgroud)
我希望现在我更清楚了.
Tör*_*bor 30
你希望MYFILE
在你(或解释器本身因为一个错误)关闭它之后做一些动作.
根据您的代码示例,问题可能是open
没有真正打开文件,脚本可能没有写入文件的权限.
将您的代码更改为以下内容以查看是否存在错误:
open(MYFILE, ">", "/home/abc/xrt/sdf/news/top.html") or die "Couldn't open: $!";
Run Code Online (Sandbox Code Playgroud)
更新
ysth指出,-w
在检查是否可以写入文件方面并不是很擅长,只是"检查模式中的一个相关标志是否已设置".此外,brian d foy告诉我,我使用的条件并不擅长处理错误.所以我删除了误导性的代码.请改用上面的代码.
Mic*_*man 13
看来open
呼叫失败了.打开文件句柄时应始终检查状态.
my $file = '/home/abc/xrt/sdf/news/top.html';
open(MYFILE, ">$file") or die "Can't write to file '$file' [$!]\n";
print MYFILE $DATA;
close MYFILE;
Run Code Online (Sandbox Code Playgroud)
如果打开不成功,内置变量$!(又名$ OS_ERROR)将包含OS-depededant错误消息,例如"权限被拒绝"
对于非古老的Perl版本,最好使用三参数形式open
和词法文件句柄:
my $file = '/home/abc/xrt/sdf/news/top.html';
open(my $fh, '>', $file) or die "Can't write to file '$file' [$!]\n";
print {$fh} $DATA;
close $fh;
Run Code Online (Sandbox Code Playgroud)
另一种说法or die
是使用autodie pragma:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
open my $fh, "<", "nsdfkjwefnbwef";
print "should never get here (unless you named files weirdly)\n";
Run Code Online (Sandbox Code Playgroud)
上面的代码产生以下错误(除非当前目录中存在名为nsdfkjwefnbwef的文件):
Can't open 'nsdfkjwefnbwef' for reading: 'No such file or directory' at example.pl line 7
Run Code Online (Sandbox Code Playgroud)