【问题标题】:How do you check the success of open (file) in Perl?在 Perl 中如何检查打开(文件)是否成功?
【发布时间】:2011-03-13 08:14:54
【问题描述】:

以下(不是 Perl 风格的)代码

#!/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 在 open 调用之后不等于 false? 由于 mydir/ 不存在,我预计打开文件的尝试会失败。

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

我已经在 Windows 7 x64 上使用 Perl 5.10.1 以及在 Fedora-11 Linux 上使用 Perl 5.10.0 进行了尝试。

我猜我的文件句柄测试是错误的。 我试过用谷歌搜索这个没有运气。 我希望这是显而易见的,但任何提示或链接将不胜感激。

谢谢, 抢。

【问题讨论】:

    标签: perl file-io


    【解决方案1】:

    只是一个警告

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

    会失败,因为$fh 是在unless 上下文中定义的,而不是在它之外/之后。 所以只有上面的 if 结构才会起作用。

    【讨论】:

      【解决方案2】:

      除了其他答案中的解释:

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

      【讨论】:

        【解决方案3】:

        $fh 没有设置为零值,而是设置为GLOB,如您的代码所示。这与 open 返回的不同,这就是成语的原因

        open(...) or die ... ;
        

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

        【讨论】:

          【解决方案4】:

          open 成功时返回非零值,失败时返回“假”值。你要找的成语是

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

          如果第一个参数 ($fh) 未定义(如本例所示),open 会将其初始化为任意值(参见Symbol::genysm method之前它尝试打开文件。因此,即使 open 调用失败,$fh 也将始终为“真”。

          【讨论】:

          • 这个模式的另一个好处是你不需要close $fh;,因为当$fh超出范围时,它会在if块的末尾自动完成。这个 Perlmonks 帖子有更多详细信息:perlmonks.org/?node_id=376754
          【解决方案5】:

          来自perldoc

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

          一个常用的成语是

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

          当然,除了die,您还可以做其他事情。

          【讨论】:

          • 附加提示:使用perldoc -f open 获取有关 Perl 内置函数的帮助。
          猜你喜欢
          • 1970-01-01
          • 2012-06-04
          • 2011-09-09
          • 2011-05-11
          • 1970-01-01
          • 2015-11-28
          • 2021-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多