2013-03-17 9 views
5

Uświadomiłem sobie, że istnieje problem z ostrzeżeniem po użyciu zapisu XML :: Smart.Perl, ostrzegam, że nie działa po 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"; 

badanie zostało wykonane w OSX 10.8.2 wersja Perl 5.12.4 1,77

ta jest prawdopodobnie ściśle związany z wewnętrznego działania XML :: elegancko, ale czy istnieje sposób, aby przywrócić xml-smart wersja drukowanie ostrzeżenia (reset STDERR).

[EDIT 19/3/2013]: W konstruktorze HP-UX jest również problematyczny. Obejście przedstawione poniżej przez ikegami może być użyte zarówno dla nowych, jak i dla zaoszczędzenia, aby przezwyciężyć problem.

+0

To działa dobrze dla mnie. Jestem na Strawberry Perl 5 wersja 16.2. Czy na pewno nie przegapisz ostrzeżenia? Nie pojawi się jako ostatni wiersz wyjścia, chyba że zaczniesz od 'STDOUT-> autoflush'. – Borodin

+1

Potwierdzone: ten sam problem na archlinuksie x86_64, XML-Smart-1.77 i perlu 5.16.2, powinieneś wypełnić zgłoszenie błędu. Z '$ | ++', nic się nie zmienia –

+4

Wydaje się, że jest to związane z funkcją o nazwie '_unset_sig_warn()' zdefiniowaną w 'XML :: Smart :: Shared', która próbuje wyłączyć' $ SIG {__ WARN __} ', przechowując ją w zmienna leksykalna. – TLP

Odpowiedz

11

Jak zauważył TLP, problem związany jest z manipulacją XML :: Smart przy pomocy $SIG{__WARN__}.

Poniżej znajduje się obejście błędu:

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

Jak wyjaśnia Borodin, to obejście lokalizuje dwa elementy% SIG, że XML :: Inteligentne modyfikuje tak, że szkoda jest ograniczona do otaczającego bloku. Wartości są automatycznie przywracane na końcu bloku, bezpośrednio po wywołaniu $XML->save.

+0

Dziękujemy! Działa to świetnie w systemie OS-X, ale czy możesz wyjaśnić to obejście i jaki efekt ma to, że działa ostrzeżenie? Spróbuję też na Solarisie mojej maszyny roboczej. –

+2

@EvangelosValtos: To, co robi to po obejściu, polega na zlokalizowaniu dwóch elementów '% SIG', które majstrują przy" XML :: Smart ", tak aby uszkodzenie było ograniczone do otaczającego bloku. Wartości są automatycznie przywracane na końcu bloku, bezpośrednio po wywołaniu '$ XML-> save'. – Borodin

+0

@Borodin, Dzięki, dodano do odpowiedzi. – ikegami

Powiązane problemy