2013-03-17 54 views
5

我意識到在使用XML :: Smart保存之後警告有問題。Perl,在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的智能版1.77

這可能是密切相關的XML ::智能的內部工作,但有沒有恢復方法警告打印(復位STDERR)。

[編輯19/3/2013]:在HP-UX構造函數中也存在問題。以下由ikegami提供的解決方法可用於新建和保存以解決該問題。

+0

這對我來說很好。我在草莓Perl 5版本16.2。你確定你沒有錯過警告嗎?它不會作爲輸出的最後一行顯示,除非您以'STDOUT-> autoflush'開頭。 – Borodin 2013-03-17 17:11:30

+1

確認:在archlinux x86_64,XML-Smart-1.77和perl 5.16.2上的相同問題,您應該填寫一個錯誤報告。使用'$ | ++',沒有任何變化 – 2013-03-17 17:17:43

+4

這似乎與'XML :: Smart :: Shared'中定義的稱爲'_unset_sig_warn()'的函數有關,它試圖通過將'$ SIG {__ WARN __}'詞彙變量。 – TLP 2013-03-17 17:25:42

回答

11

正如TLP指出的那樣,問題與XML :: Smart的$SIG{__WARN__}擺弄有關。

下面是一種變通方法的bug:

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

作爲鮑羅廷解釋,此解決方法局部化該XML ::智能修改,使得損壞被限制在封閉塊%SIG的兩個元素。在呼叫$XML->save後立即在塊結束處自動恢復值。

+0

謝謝!這對OS-X非常有用,但是請您詳細說明這個解決方法,以及它實際發出警告的效果是什麼?我也會在我的工作機器上嘗試Solaris。 – 2013-03-17 18:42:55

+2

@EvangelosValtos:這個解決方法是將'XML :: Smart'中的'%SIG'的兩個元素進行本地化,以便將損壞限制在封閉塊中。在調用'$ XML-> save'後立即在塊結尾自動恢復值。 – Borodin 2013-03-17 19:26:57

+0

@Borodin,謝謝,補充回答。 – ikegami 2013-03-17 19:34:19