2

当运行这样的代码时:

use strict;
print Dumper "something";

在编译和运行期间没有任何内容被打印出来并且没有发生错误。为什么会这样?为什么不strict阻止此代码运行?为什么运行时没有错误,即使 Dumper 是未知的?

我知道当它们被显式启用时它会产生警告,但我很感兴趣为什么这段代码以任何方式被认为是“正确的”。

4

2 回答 2

11

如果您从标准样板开始,那么您会知道:

#!/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文件句柄对象,因为它位于方法调用Dumper的与格槽中。print这使得Dumper print' 的调用者。但是您从未打开过该名称的句柄,因此您正在打印到未初始化的文件句柄。

使用我的样板。 请!

于 2010-11-25T00:50:18.373 回答
7

的有效语法之一print

print FILEHANDLE LIST

在您的程序中,Perl 将Dumper其视为文件句柄 glob。

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

print() on unopened filehandle Dumper at ...

于 2010-11-25T00:48:35.020 回答