使用 Dumper 不会触发失败

Posted

技术标签:

【中文标题】使用 Dumper 不会触发失败【英文标题】:Using Dumper not triggering a failure 【发布时间】:2011-05-15 10:36:09 【问题描述】:

当运行这样的代码时:

use strict;
print Dumper "something";

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

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

【问题讨论】:

Why does defined sdf return true in this Perl example? 的可能重复项 【参考方案1】:

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

#!/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 的调用者。但是您从未打开过该名称的句柄,因此您正在打印到未初始化的文件句柄。

使用我的样板。 请!

【讨论】:

@friedo:确保它在刷新和关闭标准输出失败时自动进行。磁盘已满。输入/输出错误。类似的东西。 默认设置自动刷新 ($|) 不是一个好习惯。有时它是有道理的,但并非总是如此,并且不应该在样板中完成。至少,样板文件应该有一个注释表明它是可选的。【参考方案2】:

print 的有效语法之一是

print FILEHANDLE LIST

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

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

print() on unopened filehandle Dumper at ...

【讨论】:

好的 - 我现在明白了。你知道为什么对未打开的文件句柄的操作默认不是错误的具体原因吗? @viraptor:因为你没有使用我的样板。这是因为 Unix 从不说“请”,,也从不说“对不起。” @viraptor:它们错误; print 将返回 false 表示它失败。它们也是警告,因为它们表示可能的编码错误。 启用警告比使用 strict 更重要。 它们是不是异常(尽管您可以使用 autodie 将所有或选定的内置插件中的错误提升为异常)。跨度> 谢谢@ysth,正是我需要的:) @Jeremy:使用&amp; 前缀子调用通常被认为是Perl 4 的遗物,并被视为或多或少已弃用。为什么你声称print &amp;Dumper(...)print Dumper(...) 更正确?如今,Also, use warnings` 往往比 perl -w 更受欢迎,原因有很多。

以上是关于使用 Dumper 不会触发失败的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIGestureRecognizer 失败后 UIPinchGestureRecognizer 不会触发

如果失败,拉取请求触发的 GitHub 操作不会锁定“合并”按钮

Flutter ios 设备不会从 FCM 通知触发 onMessage。实施 APN 时 Sendtodevice 失败

Egit 钩子不会被触发

Laravel Scheduler作业触发失败事件,即使它没有失败

TestCafe .click 不会触发 iFrame 中的 onClick 事件