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.