你如何检查Perl中open(文件)的成功?

时间:2010-07-08 13:06:26

标签: perl file-io

以下(不是很好的Perl-ish)代码

#!/usr/bin/perl

if (! -e "mydir/")
{
  print "directory doesn't exist.\n";
}
open (my $fh, ">", "mydir/file.txt");
if ($fh)
{
  print "file opened.\n";
  print $fh;
  print $fh "some text\n" or die "failed to write to file.\n";
  close ($fh);
}
else
{
  print "failed to open file.\n";
}

产生诸如此

的输出
directory doesn't exist.
file opened.
failed to write to file.
GLOB(0x...some-hex-digits...)

为什么 $ fh 在公开通话后不等于假? 由于 mydir / 不存在,我希望尝试打开该文件失败。

如果目录和文件存在,我得到类似的结果,但文件是只读的。

我在Windows 7 x64上使用Perl 5.10.1,在Fedora-11 Linux上使用Perl 5.10.0尝试过此。

我猜我的文件句柄测试错了。 我试过谷歌没有运气。 我希望它是显而易见的,但任何提示或链接都会非常感激。

谢谢, 罗布。

5 个答案:

答案 0 :(得分:19)

$fh未设置为零值,正如您的代码所示,它被设置为GLOB。这与open返回的内容不同,这就是成语

的原因
open(...) or die ... ;

unless(open(...)) {
    ...
}

答案 1 :(得分:14)

open在成功时返回非零值,在失败时返回“false”值。你正在寻找的习语是

if (open my $fh, '>', $file) {
    # open was successful
} else {
    # open failed - handle error
}

如果第一个参数($fh)未定义(在这种情况下),open会将其初始化为某个任意值(请参阅Symbol::genysm method 它会尝试打开该文件。因此即使$fh调用失败,open也会始终为“true”。

答案 2 :(得分:9)

来自perldoc

  

Open成功返回非零值,否则返回未定义值。

常用的习语是

open my $fh, '<', $filename or die $!;

当然,您可以做的不仅仅是die

答案 3 :(得分:8)

除了其他答案中的解释:

查看perl 5.10.1及更高版本附带的autodie模块(可从CPAN单独购买)。

答案 4 :(得分:0)

只是警告

unless (open my $fh , '<', 'foobar') {
    print "Error Opening";
}
print $fh, "Some Text";

将失败,因为$fh是在unless上下文中定义的,而不是在其外部/之后。 因此,只有从上方进行if构造才能起作用。