2012-04-29 31 views
9

Mi programa Perl está leyendo datos de un dispositivo en serie conectado a través de USB. Titulares de mi script en Perl: pseudo-¿Cómo suprimir las advertencias de Perl emitidas desde dentro del código de un módulo cargado?

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) 
} 

todo trabaja muy bien e incluso cuando me desconecte el dispositivo del USB que soy capaz de recuperarse de esa situación, cuando el archivo de dispositivo desaparece y vuelve a aparecer. Puedo detectar todos los errores generados en mi propio script, pero los módulos cargados (Device :: SerialPort) también generan advertencias y no quiero que aparezcan en mi registro.

¿Puedo agregar algún tipo de bandera a mi código por lo que no veo estas advertencias específicas? Para mí es importante que solo se eliminen las advertencias de los módulos, no las advertencias de mi propio script. Actualmente se parece a esto:

 
[/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 : ................ 

Por lo tanto, se trata de las dos Use of uninitialized value advertencias que quiero deshacerse de él. Las otras advertencias son mi propio registro.

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

Sería una buena idea reportar esos errores al autor. – ikegami

+0

Seguido de su consejo. – jippie

Respuesta

12

Se podría tratar de interceptar las advertencias:

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

Probado, pero lamentablemente no tiene ningún efecto. – jippie

+2

@jippie, a menos que el módulo anule específicamente '$ SIG {__ WARN __}' (no es probable) o si no son realmente advertencias (sí, sí), usar '$ SIG {__ WARN __}' ciertamente funciona. Podría ser solo una cuestión de arreglar el "si". s/Device :: Serial/Device :: SerialPort /, para principiantes. – ikegami

+0

Ratas, sí, es 'SerialPort' * not *' Serial'. Gracias ikegami. – kmkaplan

3

hizo una copia del módulo en mi directorio particular y agregó dos líneas:

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

Lo que parece funcionar. Notificado el autor.

Cuestiones relacionadas