perl - 使用 Dumper 不会触发故障

标签 perl strict data-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文件句柄对象,因为 Dumperprint 的与格槽中方法调用。这使得 Dumper print的祈求者。但是您从未打开过该名称的句柄,因此您正在打印到一个未初始化的文件句柄。

使用我的样板。 拜托!

关于perl - 使用 Dumper 不会触发故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4272816/

相关文章:

perl - 变量声明可以放在通用脚本中吗

perl - 如何在没有硬编码循环的情况下创建多个列表的组合?

javascript - 构造函数中的 "use strict"是否扩展到原型(prototype)方法?

visual-studio - Visual Studio 2017 - Option Strict 不会关闭

perl - Data::Dumper::Simple 的条件加载不工作

perl - 使用 Perl 的密码保护 PPT 文件

perl - 如何为遗留系统创建构建?

perl - 如何在不禁用严格 'refs' 的情况下重命名 perl __ANON__ sub?

perl - 如何回读使用 Data::Dumper 写入的文件(但不使用默认的 VAR 命名)?

使用 Data::Dumper 打印数组的 perl 散列