首页 文章

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

提问于
浏览
1

我有一个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 回答

  • 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' ] );
    

相关问题