2012-04-29 6 views
9

Program My Perl odczytuje dane z urządzenia szeregowego podłączonego przez USB. Nagłówki z mojego skryptu w pseudo-Perl:Jak ukryć ostrzeżenia Perla emitowane z kodu załadowanego modułu?

use warnings; 
use strict; 

use Device::SerialPort; 
my $PortObj = tie(*$handle , "Device::SerialPort" , $PortName) or die "Cannot open serial port: $!\n"; 
while (1) { 
    my $readLength = read($handle , my $frameData , $frameLength) 
} 

Wszystko działa dobrze, a nawet kiedy odłączyć urządzenie z USB jestem w stanie wyjść z tej sytuacji, gdy plik znika i pojawia się urządzenie. Mogę wychwycić wszystkie błędy powstałe z mojego własnego skryptu, ale załadowane moduły (Device :: SerialPort) również powodują ostrzeżenia i nie chcę, aby pojawiały się w moim logowaniu.

Czy mogę dodać flagę do mojego kodu, więc nie widzę tych ostrzeżeń? Ważne jest dla mnie, że tylko ostrzeżenia z modułu (modułów) są stłumione, a nie ostrzeżenia z mojego własnego skryptu. Obecnie wygląda to tak:

 
[/dev/ttyUSB1] 0x0020 : 00 00 00 00 00 00 00 00 00 AA 93 82 73 68 5E 58 : ............sh^X 
[/dev/ttyUSB1] 0x0030 : 55 54 52 52 4F 4E 50 51 50 00 00 00 00 00 00 00 : UTRRONPQP....... 
Use of uninitialized value $count_in in addition (+) at /usr/lib/perl5/Device/SerialPort.pm line 2214. 
Use of uninitialized value $string_in in concatenation (.) or string at /usr/lib/perl5/Device/SerialPort.pm line 2232. 
[/dev/ttyUSB1] Restart required! 
[/dev/ttyUSB1] Cannot open serial port: No such file or directory 
[/dev/ttyUSB1] Cannot open serial port: No such file or directory 
[/dev/ttyUSB1] Cannot open serial port: No such file or directory 

[/dev/ttyUSB1] 0x0000 : 41 42 01 40 71 01 1C E4 80 99 80 80 80 80 00 00 : [email protected] 
[/dev/ttyUSB1] 0x0010 : 00 03 00 00 83 00 01 01 00 00 00 00 00 00 00 00 : ................ 

Więc to jest o dwóch Use of uninitialized value ostrzeżeń, że chcą się pozbyć. Pozostałe ostrzeżenia to moje własne logowanie.

  • libdevice-SerialPort-perl 1.04-2build1
  • Perl v5.12.4
+2

Byłby to dobry pomysł, aby zgłosić te błędy autorowi. – ikegami

+0

Po otrzymaniu porady. – jippie

Odpowiedz

12

Można próbować przechwycić ostrzeżenia:

$SIG{'__WARN__'} = sub { warn $_[0] unless (caller eq "Device::SerialPort"); }; 
+0

Próbowałem, ale niestety nie ma żadnego efektu. – jippie

+2

@jippie, Chyba że moduł specjalnie nadpisuje '$ SIG {__ WARN __}' (nie jest prawdopodobne) lub jeśli w rzeczywistości nie są to ostrzeżenia (tak, tak), użycie '$ SIG {__ WARN __}' z całą pewnością działa. To może być po prostu kwestia naprawienia "jeśli". s/Device :: Serial/Device :: SerialPort /, na początek. – ikegami

+0

Szczury, tak to jest 'SerialPort' * nie *' Serial'. Dziękuję ikegami. – kmkaplan

3

Wykonane kopię modułu w moim Katalog domowy i dodano dwie linie:

$ diff SerialPort.pm /usr/lib/perl5/Device/SerialPort.pm 
2207,2208d2206 
<  unless (defined $count_in) { $count_in = 0; } 
<  unless (defined $string_in) { $string_in = ""; } 

Co wydaje się działać. Powiadomiono autora.