配置perl对文件IO错误更严格

时间:2010-11-08 16:29:41

标签: perl

我有一个perl脚本,其行类似于以下

my $in = new IO::File ($fn)
    or warn "Sorry, there was a problem opening $fn: $!\n",
    and return;

在我的系统上,如果$fn指定的文件路径不存在,它将显示警告并从该函数返回。

然而,有一些系统正在打印标准could not open {file path}: No such file or directory并退出脚本,而不是打印我提供并返回的警告。

我已将代码更改为更具防御性,在打开文件之前检查文件是否存在。然而,知道为什么会出现这种差异以便我将来可以正确地测试我的代码而不必发布并等待错误报告将是有用的。

是否存在perl的某些配置,当文件不存在等错误发生时会更严格?

1 个答案:

答案 0 :(得分:2)

由于它不打印您的警告,因此必须提前die。 Perl通常不会因IO错误而死,除非您使用Fatal(现已弃用为接口)或autodie(首选接口)等模块。

因此,您可以在当前运行时中查找包含autodieFatal模块的内容:

say "Fatal included from : $INC{'Fatal.pm'}";

注意:首选autodie包含Fatal,因此请检查其中任何一个。

当然,找到它正在做的更完整的方法之一就是使用

perl -d /path/to/io_script_dying_on_me.pl

并逐步执行IO :: File :: new调用 - 但是,一些Perl模块在检测到调试器时表现不同


如果它打印了你的消息,有人可能会覆盖警告warn因警告而死。他们可以通过更改警告处理程序($SIG{__WARN__})或在CORE::GLOBAL命名空间中安装其他定义来完成此操作。您可以通过以下方式查看:

use Data::Dumper;
$Data::Dumper::Deparse = 1;

say Data::Dumper->Dump( [ $SIG{__WARN__} ], [ '$SIG{__WARN__}' ] );
say Data::Dumper->Dump( [ \&CORE::GLOBAL::warn ], [ '*CORE::GLOBAL::warn' ] );