• Publicidad

Problema con expresión regular sencilla

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

Problema con expresión regular sencilla

Notapor neoranger » 2015-01-08 09:59 @458

Recién estoy aprendiendo esto de las expresiones regulares, así que estoy haciendo algunos ejercicios para ver cómo me manejo con esto.

Tengo un ejercicio el cual le paso por parámetros varios nombres y el programa solo me tiene que mostrar aquellos nombres que contienen "Ale" o "ale" en cualquier parte del nombre.

Para hacerlo más simple, usé el array @ARGV para tomar los argumentos. Hasta ahí todo va bien, pero cuando uso la expresión no sé cómo guardar el nombre cuando la expresión es correcta, sino que me muestra todos los nombres que ingresé.

¿¿Alguno me puede dar un mano??

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2.  
  3. my $name = @ARGV;
  4.  
  5. foreach $name(@ARGV)
  6. {
  7.         #print $name . "\n";
  8.  
  9.         if (my $regpex =~ (/Ale|ale|/)){
  10.                 print $1 . "\n";
  11.                 }
  12. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2015-01-08 10:16 @469, editado 1 vez en total
Razón: asi => así; como => cómo; parametros => parámetros; mas => más; se => sé; interrogaciones;
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Publicidad

Re: Problema con expresión regular sencilla

Notapor neoranger » 2015-01-08 10:23 @474

Ya lo resolví. En vez de hacer una expresión regular utilicé grep(), es mucho más fácil. El ejercicio no pedía qué usar pero yo quise usar expresiones regulares y se me estaba complicando mucho así que me decidí por grep() y así quedó:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2.  
  3. my $name = @ARGV;
  4.  
  5. my @b = grep /Ale/|/ale/, @ARGV;
  6. print "@b";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2015-01-08 10:53 @495, editado 1 vez en total
Razón: mas => más; que => qué; asi => así;
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: Problema con expresión regular sencilla

Notapor explorer » 2015-01-08 10:51 @493

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use strict;             # programación estricta
  3. use warnings;           # activar advertencias
  4. use diagnostics;        # activar explicación de advertencias
  5.  
  6. my $name;                       # declaramos una variable escalar
  7.      
  8. for $name (@ARGV) {             # para cada argumento...
  9.     #print "$name\n";
  10.      
  11.     if ($name =~ m/(Ale|ale)/) {        # ¿$name contiene Ale o ale?
  12.         print "$1\n";                   # sí, pintamos lo capturado por los paréntesis
  13.     }
  14. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Una expresión regular se debe aplicar a un valor escalar, en este caso, $name.

El operador es el =~ (o el !~ en caso de que queramos negar el resultado).

En el lado derecho se suele poner el operador de coincidencia m// o el de sustitución s/// o el de transliteración tr/// (y///). Como el operador m// es muy común, se suele simplificar a solo //. (Más información en tu propio ordenador en perldoc perlop, y en la Web (traducido al español), sección Operadores Regexp entrecomillados).

Dentro de los delimitadores, hay un patrón de exp. reg. En este caso, usamos el carácter '|' para separar alternativas, y los paréntesis para capturar en $1, $2, etc. lo que se encuentre.

Tienes un buen resumen de las expresiones regulares en la página de Wikipedia, en perldoc perlre (traducido al español), y un manual en perlretut (todavía no terminado de traducir).

grep() viene fenómeno para hacer filtros, así que viene bien para este ejercicio.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use strict;
  3. my @b = grep { /Ale|ale/ } @ARGV;
  4. print "@b\n";
Coloreado en 0.001 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: Problema con expresión regular sencilla

Notapor neoranger » 2015-01-08 11:19 @513

Gracias, explorer, por la respuesta. Me estaba complicando mucho haciendo la exp. reg. y no me di cuenta que era muy fácil.

Te corrijo en una cosa, yo no quería imprimir lo que contiene el resultado de la expresión regular sino el nombre de acuerdo a lo capturado, es decir, que si me encuentra "Ale" me imprima "Alejandro".

Con solo cambiar print "$1\n"; por print "$name\n"; se arregla eso.

Gracias de nuevo.

Saludos.
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: Problema con expresión regular sencilla

Notapor Aceitunas » 2015-01-22 12:52 @578

Hola,

Si usas expresiones regulares usando el modificador "i" te ahorras escribir dos veces el patrón.

¡Perdón por abrir de nuevo el tema!
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: Problema con expresión regular sencilla

Notapor migbur » 2015-01-28 09:24 @433

Hola.

También soy nuevo en esto del Perl.

Al final nadie ha respondido a la pregunta. Entiendo que grep es una opción pero imagino que con una expresión regular también es posible, ¿no?

¿Alguien sabe cómo?

Porque la expresión que indica la veo correcta. Debería funcionar, ¿no?

Saludos
migbur
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2014-12-19 07:04 @336

Re: Problema con expresión regular sencilla

Notapor explorer » 2015-10-03 06:17 @304

Sí, una expresión regular se puede usar tanto en un if() como en un grep(), ya que el resultado de la expresión regular es un valor booleano.

Si miras los códigos de más arriba, verás que se usa de las dos maneras.
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


Volver a Básico

¿Quién está conectado?

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