捕获在perl中创建对象的问题

时间:2018-04-10 01:57:14

标签: perl

我正在使用perl 5.16.3并面临以下问题

我有一个代码,可以使用以下代码读取Config :: General格式文件:

use Config::General qw(ParseConfig);
my $meta_file = "/foo/bar/file";
my $hash;
eval {
    $hash = {ParseConfig($meta_file)};
};

if ($@) {
    print $@;
}

现在当文件指向buy $ meta_file出现问题时,此代码将失败,堆栈跟踪类似于以下内容:

  

在数字eq(==)中使用未初始化的值$ n_read     配置::一般_ openfile_for_read( '配置::一般= HASH(0xff92e30)',   '/富/酒吧/文件')     配置::一般_开( '配置::一般= HASH(0xff92e30)',   '/富/酒吧/文件')     配置::一般_进程( '配置::一般= HASH(0xff92e30)')     Config :: General :: new('Config :: General','/ foo / bar / file')

有没有办法捕获这个并继续我的代码?

1 个答案:

答案 0 :(得分:4)

eval中的代码似乎终止程序,因此从初始化代码触发的die必须已转义。该模块使用Carp::Heavy偶尔报告了奇怪的行为,这可能是麻烦的根源。模块的源代码中也引用了各种错误报告。

您可以尝试使用hook for die

来控制此操作
$SIG{__DIE__} = sub { say "Got: @_" };

但这可能会或可能不会奏效。

最终问题是为什么会发生这种情况。报告的警告(本身不会终止程序)可以跟踪in the source to

  

#尝试读取初始的utf8字节顺序标记(BOM)

my $n_read  = sysread $fh, my $read_BOM, length(_UTF8_BOM);

显然无法阅读,因为$n_read在下一行仍未定义(“未初始化”)。 sysreadundef返回表示错误。常数_UTF8_BOM is defined as

use constant _UTF8_BOM => "\x{ef}\x{bb}\x{bf}";

:utf8图层以后的三个字符仅设置在sysread以下几行(有条件)

请检查文件的第一个字符。我试图混淆sysread(其中一个猜测是空字节)但无法重现行为。一个空文件也可以正常工作。