【问题标题】:Perl, warn not working after XML::Smart savePerl,在 XML::Smart 保存后警告不起作用
【发布时间】:2013-03-17 16:58:35
【问题描述】:

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

#!/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)。

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

【问题讨论】:

  • 这对我来说很好用。我在 Strawberry Perl 5 版本 16.2 上。你确定你没有错过警告吗?除非您以 STDOUT->autoflush 开头,否则它不会显示为输出的最后一行。
  • 已确认:archlinux x86_64、XML-Smart-1.77 和 perl 5.16.2 上的相同问题,您应该填写错误报告。使用$|++,没有任何变化
  • 这似乎与XML::Smart::Shared 中定义的名为_unset_sig_warn() 的函数有关,该函数试图通过将$SIG{__WARN__} 存储在词法变量中来禁用它。

标签: perl stderr


【解决方案1】:

正如 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 之后立即恢复。

【讨论】:

  • 谢谢!这在 OS-X 上效果很好,但您能否详细说明此解决方法以及它对实际使警告起作用的影响?我还将在我的工作机器上尝试 Solaris。
  • @EvangelosValtos:这个变通办法的作用是将%SIGXML::Smart 修补的两个元素本地化,以便将损坏限制在封闭的块中。在调用$XML->save 之后,值会在块的末尾自动恢复。
  • @Borodin,谢谢,添加到答案中。
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多