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

使用翻车机不会触发故障

  •  2
  • viraptor  · 技术社区  · 14 年前

    当运行这样的代码时:

    use strict;
    print Dumper "something";
    

    在编译和运行期间不会打印任何内容,也不会发生错误。为什么会这样?为什么不 strict 阻止此代码运行?为什么运行时没有错误,即使转储程序未知?

    我知道当显式启用这些代码时,它会发出警告,但我感兴趣的是,为什么这段代码在任何方面都被认为是“正确的”。

    2 回复  |  直到 12 年前
        1
  •  7
  •   socket puppet    14 年前

    有效语法之一 print

    print FILEHANDLE LIST
    

    在您的程序中Perl正在处理 Dumper 作为一个文件句柄全局。

    在启用警告的情况下运行此代码将告诉您:

    print() on unopened filehandle Dumper at ...

        2
  •  11
  •   tchrist    14 年前

    如果你从标准样板开始,你就会知道:

    #!/usr/bin/env perl
    #
    # name_of_program - what the program does as brief one-liner
    #
    # Your Name <your_email@your_host.TLA>
    # Date program written/released
    #################################################################
    
    use 5.10.0;
    
    use utf8;
    use strict;
    use autodie;
    use warnings FATAL => "all";
    
    #  ⚠ change to agree with your input: ↓
    use open ":std" => IN    => ":encoding(ISO-8859-1)",
                       OUT   => ":utf8";
    #  ⚠ change for your output: ↑ — *maybe*, but leaving as UTF-8 is sometimes better
    
    END {close STDOUT}
    
    our $VERSION = 1.0;
    
    $| = 1;
    

    答案是你的程序在语法上是正确的,但在语义上是不正确的。你在打印 "something" 未开封的 Dumper filehandle对象,因为 翻车机 在与格槽中 print 方法调用。这使得 翻车机 打印 的发票。但您从未以该名称打开句柄,因此您正在打印到未初始化的文件句柄。

    用我的样板。 拜托!