Perl,在XML :: Smart保存后警告不能正常工作

时间:2013-03-17 16:58:35

标签: perl stderr

我意识到使用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下面提供的解决方法可以用于new和save来解决这个问题。

1 个答案:

答案 0 :(得分: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后立即在块结束时自动恢复这些值。