代码之家  ›  专栏  ›  技术社区  ›  Rhubbarb

如何在Perl中检查open(file)的成功?

  •  13
  • Rhubbarb  · 技术社区  · 14 年前

    #!/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 作为 我的目录/ 不存在,我希望打开文件的尝试失败。

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

    我在windows7x64上用perl5.10.1和Fedora-11linux上用perl5.10.0进行了尝试。

    我希望这是一些明显的,但任何提示或链接将不胜感激。

    罗伯。

    4 回复  |  直到 14 年前
        1
  •  19
  •   msw    14 年前

    $fh 不是设置为零值,而是设置为 GLOB 如代码所示。这和什么不同 open 这就是为什么这个成语

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

    unless(open(...)) {
        ...
    }
    
        2
  •  17
  •   mob    14 年前

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

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

    如果第一个参数( $fh )未定义(如本例所示), 打开 将其初始化为任意值(请参见 Symbol::genysm method 之前 总是 即使 呼叫失败。

        3
  •  9
  •   musiKk    14 年前

    perldoc :

    一个常用的成语是

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

    当然,你可以做些别的事情,而不是简单的 die .

        4
  •  8
  •   tsee    14 年前

    除其他答案中的解释外:

    autodie Perl5.10.1及更高版本附带的模块(可从CPAN中单独获得)。

        5
  •  0
  •   Andrew    4 年前

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

    会失败,就像 $fh unless 上下文,而不是外部/后面。 所以只有上面的if结构才能工作。