Perl 使用Config::General分析错误文件时捕获问题

Perl 使用Config::General分析错误文件时捕获问题,perl,Perl,我正在使用Perl5.16.3,面临以下问题 我有一个使用以下代码读取Config::General格式文件的代码: use Config::General qw(ParseConfig); my $meta_file = "/foo/bar/file"; my $hash; eval { $hash = {ParseConfig($meta_file)}; }; if ($@) { print $@; } 现在,当文件$meta_文件中出现问题时,此代码将失败,堆栈跟踪如下

我正在使用Perl5.16.3,面临以下问题

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

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

if ($@) {
    print $@;
}
现在,当文件$meta_文件中出现问题时,此代码将失败,堆栈跟踪如下所示:

使用未初始化值$n_读入数值等式(=) Config::General::_openfile_for_read('Config::General=HASH(0xff92e30)', “/foo/bar/file”) Config::General::_open('Config::General=HASH(0xff92e30)', “/foo/bar/file”) Config::General::_进程('Config::General=HASH(0xff92e30)' Config::General::new('Config::General','/foo/bar/file')


是否有办法捕获此代码并继续使用我的代码?

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

您可以尝试使用

但这可能有效,也可能无效

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

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

由于
$n_read
而无法读取的内容在下一行中保持未定义(“未初始化”)。从返回的
undef
指示错误。常数

(自<代码>起的三个字符:utf8
层仅在<代码>sysread下几行设置,有条件)


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

我在生成库拒绝解析的配置文件时遇到了惊人的困难。你能为测试提供一个错误的配置文件吗?我仍然看不到你的代码是如何从内部消失的<代码>鲤鱼::严重的问题?源代码中还引用了一些bug报告。如果您添加一个hook
$SIG{{uuuu DIE}=sub{say“DIE:@}
,会发生什么?(仍然会出现“uninitialized”(未初始化)警告,您可以抑制该警告,但这不会终止您的程序。)但即使有效,您仍需要找出文件的错误。我在文档中找不到任何关于错误处理的词。。。但从源代码来看,他们的代码似乎无法读取,它从文件中读取初始字符以检查BOM表。因此,它在源代码的下一行是“未初始化”(未定义)。你的文件开头有什么奇怪的地方吗?我尝试过(也使用了一个空文件),但无法复制。
$SIG{__DIE__} = sub { say "Got: @_" };
my $n_read  = sysread $fh, my $read_BOM, length(_UTF8_BOM);
use constant _UTF8_BOM => "\x{ef}\x{bb}\x{bf}";