当运行这样的代码时:
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
的召唤者。但是您从未打开过该名称的句柄,因此您正在打印到未初始化的文件句柄。
使用我的样板。PLEASE!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)