我正在使用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')
有没有办法捕获这个并继续我的代码?
答案 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
在下一行仍未定义(“未初始化”)。 sysread的undef
返回表示错误。常数_UTF8_BOM
is defined as
use constant _UTF8_BOM => "\x{ef}\x{bb}\x{bf}";
(:utf8
图层以后的三个字符仅设置在sysread
以下几行(有条件)
请检查文件的第一个字符。我试图混淆sysread
(其中一个猜测是空字节)但无法重现行为。一个空文件也可以正常工作。