• Publicidad

Obtener mensaje de una cadena de texto

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Obtener mensaje de una cadena de texto

Notapor alperez » 2014-10-08 03:49 @200

Hola.

Estoy intentando obtener datos de mensajes de error que vienen con la siguiente forma:

"Sat Jul 13 16:13 Encl 1 (8F45751042) A power supply module is either faulty or unpowered. Another failure will make the system inoperative. Rectify problem immediately"

De momento he hecho un split() para obtener todos los datos hasta el mensaje de texto que genera la alarma:

A power supply module is either faulty or unpowered. Another failure will make the system inoperative. Rectify problem immediately

La duda que me surge es, ¿Cómo puedo obtener el mensaje de texto de la alarma sin tener que fraccionarlo trozo a trozo? Esto es porque todas las alarmas tienen los mismos campos hasta el mensaje de la alarma, pero claro, luego cada alarma tendrá un tamaño distinto.

Muchas gracias.
Última edición por explorer el 2014-10-08 04:00 @208, editado 1 vez en total
Razón: Como => Cómo; tendra => tendrá
alperez
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-14 17:48 @783

Publicidad

Re: Obtener mensaje de una cadena de texto

Notapor explorer » 2014-10-08 04:06 @212

¿Puedes publicar el código que tienes?

¿La parte Encl 1 (8F45751042) siempre es fija?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener mensaje de una cadena de texto

Notapor alperez » 2014-10-08 05:43 @280

Hola, explorer,

Sí, la parte esa siempre es fija.
Última edición por explorer el 2014-10-08 05:52 @286, editado 1 vez en total
Razón: Si => Sí
alperez
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-14 17:48 @783

Re: Obtener mensaje de una cadena de texto

Notapor explorer » 2014-10-08 07:05 @337

Bueno... se puede hacer un apaño: tomando el último paréntesis como ancla, podemos partir por ahí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -l
  2.  
  3. my $texto = "Sat Jul 13 16:13 Encl 1 (8F45751042) A power supply module is either faulty or unpowered. Another failure will make the system inoperative. Rectify problem immediately";
  4.  
  5. my($preambulo, $msg_error) = split /[)] /, $texto, 2;
  6.  
  7. print "[$preambulo)]";
  8. print "[$msg_error]";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[Sat Jul 13 16:13 Encl 1 (8F45751042)]
[A power supply module is either faulty or unpowered. Another failure will make the system inoperative. Rectify problem immediately]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener mensaje de una cadena de texto

Notapor alperez » 2014-10-08 08:30 @395

Jope,

Muchas gracias, no lo había pensado en coger de esta manera.
alperez
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-14 17:48 @783

Re: Obtener mensaje de una cadena de texto

Notapor Aceitunas » 2014-10-20 16:55 @746

Hola,

Por colaborar un poco pongo otra posible solución con expresiones regulares.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $texto = "Sat Jul 13 16:13 Encl 1 (8F45751042) A power supply module is either faulty or unpowered. Another failure will make the system inoperative. Rectify problem immediately";
  2.  
  3. $texto =~ /\)(.*)/;
  4.  
  5. print $1;
  6.  
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


saludos.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Obtener mensaje de una cadena de texto

Notapor explorer » 2014-10-21 04:58 @248

Ahora que me doy cuenta, hay una solución más obvia y rápida: no usar expresiones regulares. ;)

Si lo que estamos buscando es una cadena de texto fija (un paréntesis de cierre), podemos usar la función index() o rindex() para localizarla, y cortar el texto con substr():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $texto = 'Sat Jul 13 16:13 Encl 1 (8F45751042) A power supply module is either faulty or unpowered. Another failure will make the system inoperative. Rectify problem immediately';
  2.  
  3. my $msg_error = substr $texto, 2 + index $texto, ')';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
El '+2' es para saltar al segundo carácter a partir del lugar donde está el paréntesis de cierre.

Gracias a Aceitunas me he dado cuenta.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener mensaje de una cadena de texto

Notapor Aceitunas » 2014-10-21 05:18 @262

Pero, explorer, eso es básicamente lo que hace split internamente, ¿no?
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Obtener mensaje de una cadena de texto

Notapor explorer » 2014-10-21 10:45 @489

No, no es lo mismo.

El split() realiza una búsqueda repetida de un patrón de exp. reg., mientras que index() busca una cadena literal, con lo que la búsqueda es mucho más rápida.

En concreto, es el DOBLE de rápida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Benchmark qw(cmpthese) ;
  3.  
  4. my $texto = "Sat Jul 13 16:13 Encl 1 (8F45751042) A power supply module is either faulty or unpowered. Another failure will make the system inoperative. Rectify problem immediately";
  5.  
  6. cmpthese( -3,
  7.     {
  8.         'split' => sub {
  9.                     my(undef, $msg_error) = split/[)] /, $texto, 2;
  10.         },
  11.         'index' => sub {
  12.                     my $msg_error = substr $texto, 2 + index $texto, ')';
  13.         },
  14.         'regex' => sub {
  15.                     my($msg_error)= $texto =~ /[)](.*)/;
  16.         },
  17.     }
  18. );
  19.  
  20.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
           Rate regex split index
regex  973939/s    --  -49%  -75%
split 1926301/s   98%    --  -51%
index 3891800/s  300%  102%    --
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener mensaje de una cadena de texto

Notapor Aceitunas » 2014-10-21 12:51 @577

:shock: Cierto... es incluso más lento que la expresión regular.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron