2013-03-17 34 views
5

Ben XML :: Akıllı tasarruf kullanıldıktan sonra uyarmak ile ilgili bir sorun olduğunu fark kurtardı.Perl, XML sonra çalışmıyor uyarmaya :: Akıllı

#!/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"; 

Testi OSX 10.8.2 perl sürümü yapılır 5.12.4 xml-akıllı versiyonu Bu muhtemelen yakından XML :: Akıllı çalışma biçiminde ilişkili, ancak geri yüklemek için bir yol yoktur edilir 1.77

uyarının basılması (STDERR'i sıfırla).

[DÜZ 19/3/2013]: HP-UX yapıcısında de problemlidir. Aşağıda ikegami tarafından sağlanan geçici çözüm, hem yeni hem de sorunun üstesinden gelmek için kullanılabilir. TLP belirttiği gibi

+0

Bu benim için iyi çalışıyor. Ben Strawberry Perl 5 versiyon 16.2'deyim. Uyarıyı kaçırmadığından emin misin? “STDOUT-> autoflush” ile başlamadığınız sürece son çıktı satırı olarak görünmez. – Borodin

+1

Onaylandı: archlinux x86_64, XML-Smart-1.77 ve perl 5.16.2 ile aynı sorun, bir hata raporu doldurmalısınız. '$ Ile | ++', hiçbir şey –

+4

değiştirir Bu XML 'tanımlanan denilen bir işlev' _unset_sig_warn() ':: Akıllı :: Shared' bir depolayarak' '$ SIG {__ __ WARN} devre dışı bırakmaya çalıştığında bağlı gözükmektedir sözcüksel değişken. – TLP

cevap

11

, sorun XML ile ilgilidir :: Smart'ın işe yaramaz $SIG{__WARN__} ile. Borodin şöyle açıklıyor

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

, bu geçici çözüm, XML :: Akıllı değiştirir, böylece hasar kapsayan bloğuna sınırlı olduğunu,% SIG iki öğe yerleşir bu: Aşağıdaki

hatadan bir çözümdür. Değerler, bloğun sonunda, $XML->save numaralı çağrıdan hemen sonra otomatik olarak geri yüklenir.

+0

Teşekkür ederiz! Bu OS-X üzerinde harika çalışıyor, ancak bu geçici çözüm üzerinde ayrıntılı olarak çalışabilir misiniz ve aslında uyarmak için ne gibi bir etkisi vardır? Ayrıca, Solaris'i iş makinemde deneyeceğim. –

+2

@EvangelosValtos: Ne bu çözüm yapar hasar kapsayan bloğuna kısıtlanacak şekilde 'XML :: Smart', ele alınırken bu'% SIG' iki unsurları lokalize olduğunu. Değerler, "XML -> kaydet" çağrısından hemen sonra, bloğun sonunda otomatik olarak geri yüklenir. – Borodin

+0

@Borodin, Teşekkürler, yanıt eklendi. – ikegami