• Publicidad

Error básico con extracción de coincidencias [RESUELTO]

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

Error básico con extracción de coincidencias [RESUELTO]

Notapor Leo_Gutierrez » 2010-12-23 15:58 @707

Hola a todos.

Estoy estudiando expresiones regulares, estoy analizando la salida del comando date:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
jue dic 23 13:56:34 MST 2010
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Quiero obtener toda la hora, estoy usando esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.010;
  5. # jue dic 23 13:44:39 MST 2010
  6. my $hora = ${\join(" ", qx|date|)} =~ m/(\d\d\:\d\d\:\d\d)/;
  7. say $hora;
  8. say $1;
  9.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Es extraño, en $hora se pone solo un 1, pero en $1 queda todo correcto.

¿Me podrían guiar?

Edito, me respondo, según yo join() trabajaba en contexto de arreglo, el 1 que me regresa es porque haya solo una coincidencia. Para arreglarlo solo he hecho:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my($hora) = ${\join(" ", qx|date|)} =~ m/(\d\d\:\d\d\:\d\d)/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por Leo_Gutierrez el 2010-12-25 14:22 @640, editado 1 vez en total
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Publicidad

Re: Error básico con extracción de coincidencias

Notapor explorer » 2010-12-23 16:06 @712

$hora está almacenando el resultado de la ejecución de la exp. reg., así que un 1 indica que ha tenido éxito.

Edito: Al poner $hora entre paréntesis entonces pasa a contexto escalar, y la exp. reg. regresa los valores capturados por los paréntesis de captura.

P.D. Me parece demasiado complejo lo que escribes con el join(). Es mejor hacer en varias líneas que no todo en una sola, salvo que quieras participar en el Perl Golf.
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: Error básico con extracción de coincidencias

Notapor Leo_Gutierrez » 2010-12-23 16:10 @715

Jaja :D yo sé que es algo complejo, es solo por estudiar. Estoy totalmente a favor de la legibilidad. ¿Qué es el Perl Golf?
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Error básico con extracción de coincidencias

Notapor explorer » 2010-12-23 16:34 @732

Quedaría así:

my($hora) = qx(date) =~ m/(\d\d\:\d\d\:\d\d)/;
say $hora;

Perl Golf era una competición para intentar conseguir el programa más corto para resolver cualquier tarea.
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: Error básico con extracción de coincidencias

Notapor Leo_Gutierrez » 2010-12-23 16:40 @736

Qué bien, es que pensé que qx() me devuelve un vector, y utilice join para pasarlo a un contexto escalar.

Bueno, queda así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my($hora) = qx(date) =~ m/(\d+\:\d+\:\d+)/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Error básico con extracción de coincidencias

Notapor explorer » 2010-12-23 16:54 @746

Sí, qx() devuelve una lista de elementos, pero si es evaluada en contexto de lista. Cada elemento de la lista corresponde a cada línea del resultado de la ejecución.

Y devuelve un solo elemento si es en contexto escalar, como es en este caso. Todo el resultado se guarda en un solo valor.

Otra forma de escribirlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -E 'my($h) = qx(date) =~ m/([\d:]{8})/; say "[$1]"'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La pregunta que se deja al lector es, ¿por qué es necesaria la presencia de '{8}'? ¿Qué pasa si lo quitamos?
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: Error básico con extracción de coincidencias

Notapor Leo_Gutierrez » 2010-12-23 17:03 @752

Porque queremos que esté presente solo 8 veces. Si lo quitáramos cogería el primer dígito encontrado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -E 'qx(date) =~ m/([\d:]{8})/; say "[$1]"'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Error básico con extracción de coincidencias

Notapor explorer » 2010-12-23 18:10 @798

¿Qué es eso de que esté presente? ¿Quién? Y si lo quitamos, ¿qué número captura?
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: Error básico con extracción de coincidencias

Notapor Leo_Gutierrez » 2010-12-23 19:02 @834

Lo que buscamos son 8 caracteres, que se componen de 00:00:00, horas, minutos y segundos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. leo@leo-desktop:~/Escritorio$ date
  2. jue dic 23 17:00:35 MST 2010
  3. leo@leo-desktop:~/Escritorio$ date | awk '{print $4}'
  4. 17:00:36
  5. leo@leo-desktop:~/Escritorio$
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si quitamos el {8}, nos daría el primer dígito, el de los días.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026


Volver a Básico

¿Quién está conectado?

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