5

XML::Smart save の使用後に warn に問題があることに気付きました。

#!/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 が提供する以下の回避策は、問題を解決するために new と save の両方で使用できます。

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 の 2 つの要素をローカライズして、損傷が囲んでいるブロックに制限されるようにします。値は、 への呼び出しの直後、ブロックの終わりに自動的に復元されます$XML->save

于 2013-03-17T17:43:42.253 に答える