5

我意识到使用 XML::Smart 保存后出现警告问题。

#!/usr/bin/perl

use strict;
use warnings;

use XML::Smart;

my $XML = XML::Smart->new() ;

print STDOUT "Before save: Print to STDOUT works\n";
print STDERR "Before save: Print to STDERR works\n";
warn "Before save: Warn works\n";

$XML->save('newfile.xml') ;

print STDOUT "After save: Print to STDOUT works\n";
print STDERR "After save: Print to STDERR works\n";
warn "After save: Warn does not work\n";

测试在 OSX 10.8.2 perl 版本 5.12.4 xml-smart 版本 1.77 中完成

这可能与 XML::Smart 的内部工作密切相关,但有没有办法恢复警告的打印(重置 STDERR)。

[编辑 19/3/2013]:在 HP-UX 构造函数中也存在问题。ikegami 下面提供的解决方法可用于新建和保存以克服该问题。

4

1 回答 1

11

正如 TLP 指出的那样,问题与 XML::Smart 对$SIG{__WARN__}.

以下是该错误的解决方法:

{
    local $SIG{__WARN__} = $SIG{__WARN__};
    local $SIG{__DIE__}  = $SIG{__DIE__};
    $XML->save('newfile.xml') ;
}

正如 Borodin 解释的那样,此解决方法将 XML::Smart 修改的 %SIG 的两个元素本地化,以便将损坏限制在封闭块中。这些值在块结束时自动恢复,在调用$XML->save.

于 2013-03-17T17:43:42.253 回答