domingo, 23 de diciembre de 2012

Expresiones regulares Perl Parte III/III

Esta es la ultima parte de estos tres tutoriales que tratan sobre como usar expresiones regulares en perl :(

Como dije y he dicho y seguiré diciendo Perl es un lenguaje muy potente y que sirve para todo,mucho de este poder viene de que es muy,muy potente para procesar y trabajar con texto,parte de este poder viene de las expresiones regulares y que también tiene parte de awk y sed.En este caso y en los tutoriales anteriores hemos aprendido que se puede procesar el texto de una manera sorprendente,pero, mientras mas o mejor queramos procesar o requerir algo sera mas complicado de especificar al interprete,por ejemplo:

Tenemos esta cadena de texto

Hola que tal me gusta programar :)

Y queremos eliminar la carita del final, o mejor aun queremos suplantar esa frase por

Hola que tal no me gusta programar

Como es un lenguaje de programación necesitamos usar muchos símbolos ya que en lenguaje "español" seria:

Cámbiame esto por esto.

Y ese es el propósito de estos tutoriales,aprender a leer y escribir código como si fuese nuestro lenguaje natural,como lo que dije de la carita no va a mas de esto:

my $cadena = "Hola que tal me gusta programar :)";

print "$cadena\n";

$cadena =~ s/tal/tal no/;

my @carita = split(/[:)]/, $cadena);

print "@carita\n";

Comencemos

Voy a usar la función split de arrays que no hemos visto pero sirve para cortar algo de una array o scalar y su sintaxis es simple:

my @array = split(expresión |palabra, $scalar);

Lo primero que  vamos a ver son las meta secuencias,las meta secuencias son expresiones que se añaden en la sintaxis de la expresión para poder hacer un filtrado/búsqueda mas especifico:

\d # Se usa para dígitos

Por ejemplo

my $cadena = "Hola 12345 < eso es un numero";

my @array = split(/\d/, $cadena); # Quitando los numeros

print @array, "\n";

\D # Contrario a \d

my $cadena = "Hola 12345 < eso es un numero";

my @array = split(/\D/, $cadena); # Dejando los numeros

print @array, "\n";

 \s # Quita espacios en blanco

my $cadena = "Hola 12345 < eso es un numero";

my @array = split(/\s/, $cadena); # Quitando espacios

print @array, "\n";

\S # Deja solo los espacios

Podemos usar

my $cadena = "Hola 12345 < eso es un numero";

my @array = split(/\S/, $cadena); # Quitando espacios

print @array;

\t # Cualquier tabulador

my $cadena = "Hola 12345          < eso es un tabulador";

my @array = split(/\t/, $cadena); # Quitando espacios del tab

print @array;

\w # Busca palabras y caracteres alfa-numericos,podemos pensar que es similar a \s,pero en este caso podemos usarlo en una estructura selectiva:

my $cadena = "&/()=?";

if ( $cadena =~ m/\w/ ){ print "Hay palabras en cadena\n"; }else{

print "No hay palabras en cadena\n"; }

\W # Contrario a \w

Hay mas,pero son los que mas se usan y que yo uso, así que no les puedo hablar bien de los otros,pero pueden googlear.

Caracteres de operadores

Como vimos en los dos tutoriales pasados existe m// y s///,ademas de tr/// que no hemos visto:

tr/// es una expresión de cambio,como s/// solo que mas propia,por ejemplo

my $nombre = "Damian";

$nombre =~ tr/a/e/; # El resultado es Demien

print $nombre;

Se llama operador de traducción y no lee variables dentro de la expresión..

Ahora si los operadores:

i # no reconoce mayúsculas o minúsculas

m # Reconoce varias lineas y las toma como solo una(ignora \n)

g # Recorre toda la cadena y trabaja todos los coincidentes

Estos tres símbolos van así en la sintaxis de la regex

m/palabra/i # m,g

Esto lo podemos usar en vez de pasar la string a la función de split de un array,por ejemplo yo hice:

my $cadena = "Hola 12345 < eso es un numero";

my @array = split(/\s/, $cadena); # Quitando espacios

print @array, "\n";

Y con estos operadores podemos "obtener el mismo resultado" así:

my $cadena = "Hola 12345 < eso es un numero";

$cadena =~ s/\s//g;

print $cadena;

Ahora sabiendo que son las meta secuencias, vamos a ver los cuantificadores,estos símbolos son caracteres especiales,los cuales usamos para un filtrado/búsqueda mas especial/exacta por ejemplo el cuantificador * parecido a la wildcard de Unix,nos sirve para verificar si hay algo o no

Como dije es similar a las wildcards de Unix:

my $cadena = "iPhone";

if($cadena =~ /\w*Phone/){ print "TRUE\n"; }
else { print "FALSE\n"; }

Checa si esta algo antes de Phone,por ejemplo

ePhone,aPhone,dPhone,loqueseaPhone

Y si lo encuentra da un valor verdadero,por lo cual usaríamos if en este caso

Podemos ver esto mas especifico cortando con split

my $cadena = "Tengo un iPhone2g";

my @array = split(/\w*Phone/, $cadena );

print "@array\n";

Deja solo tengo un 2g

Ahora veamos el {m,M}, lo que esta adentro de {} es m(menor),M(Mayor),
Este cuantificador nos da control sobre la veces o numero que queremos trabajar algo

Por ejemplo ejecuta este script:

#!/usr/bin/env perl

system("clear");

print "Escribe los numero que quieras: ";

my $cadena = <>;

chop($cadena);

if ( $cadena =~ /\d{3,6}/ ) { print "Hay entre 3 y 6 números o mas\n"; }
else { print "No hay entre 3 y 6 números\n"; }

Ahora sin limitaciones o especificaciones se usa este símbolo +,este símbolo quiere decir una o mas veces,por lo cual si indicamos por lo menos un numero dará un valor verdadero

#!/usr/bin/env perl

system("clear");

print "Escribe lo que quieras: ";

my $cadena = <>;

chop($cadena);

if ( $cadena =~ /\d+/ ) { print "Hay 1 o mas numeros\n"; }
else { print "No hay numeros\n"; }

Y lo podemos emplear con los otros operadores(\w,\s,etc)

Aquí un ejemplo mas grande,para que vean ,ejecuten y analicen

Enlace


Eso es todo :D


Falta mucho,pero de momento es una introducción,pueden checar mas información en:

http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

http://perlenespanol.com/tutoriales/expresiones_regulares/

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.