当运行这样的代码时:
use strict;
print Dumper "something";
在编译和运行期间没有任何内容被打印出来并且没有发生错误。为什么会这样?为什么不strict
阻止此代码运行?为什么运行时没有错误,即使 Dumper 是未知的?
我知道当它们被显式启用时它会产生警告,但我很感兴趣为什么这段代码以任何方式被认为是“正确的”。
当运行这样的代码时:
use strict;
print Dumper "something";
在编译和运行期间没有任何内容被打印出来并且没有发生错误。为什么会这样?为什么不strict
阻止此代码运行?为什么运行时没有错误,即使 Dumper 是未知的?
我知道当它们被显式启用时它会产生警告,但我很感兴趣为什么这段代码以任何方式被认为是“正确的”。
如果您从标准样板开始,那么您会知道:
#!/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
' 的调用者。但是您从未打开过该名称的句柄,因此您正在打印到未初始化的文件句柄。
使用我的样板。 请!
的有效语法之一print
是
print FILEHANDLE LIST
在您的程序中,Perl 将Dumper
其视为文件句柄 glob。
在启用警告的情况下运行此代码将告诉您:
print() on unopened filehandle Dumper at ...