domingo, 16 de diciembre de 2012

Expresiones regulares Perl Parte II/III

Seguimos con las expresiones regulares de Perl :D.

Como hemos visto perl es una potencia en el manejo de texto y con el uso de expresiones regulares es de donde viene parte de este poder lo que vamos a ver es mas complicado que la parte 1 pero es muy útil el uso de expresiones en nuestros scripts, así que si te gusta Perl necesitas aprenderlos.

Parte 1

En la entrada pasada vimos como cambiar texto y como verificar una cadena para ver si encuentra una coincidencia,esto lo hacíamos con una palabra en especifico,ahora lo aremos solo con una(s) letra(s) en especifico en ves de una palabra,

Por ejemplo verificar si una cadena contiene la letra t.

Por ejemplo:

Tenemos una variable de cadena que contiene Tiempo de Tux

my $variable = "Tiempo de Tux";

Y queremos verificar si contiene la letra t en la variable,para esto hacemos uso de caracteres:

/[caracteres]/
Estos caracteres lo que hacen es buscar en lo que indiquemos las letras que estén en:

/[aqui]/
Por ejemplo /[caracter]/ no busca la palabra carácter busca en la cadena las letras c,a,r,t,e

Así vean el ejemplo para buscar Tiempo de Tux



#!/usr/bin/env perl 

# Caracteres,expresiones regulares 1---{

use strict;
use warnings;

my $cadena = "Tiempo de Tux";

if ($cadena =~ /[T]/){
print "Se encontro T en $cadena \n";
}
else{ print "No se encontró T en $cadena \n"; }


Ese ejemplo esta muy fabricado ya que pueden ver que incluso no haria falta el else,pero de todas formas es un ejemplo,pero aun se puede pensar que es como el anterior,que solo busca la primera linea,y no es así(en este ejemplo) vean este ejemplo:


#!/usr/bin/env perl 

# Caracteres,expresiones regulares 2---{

use strict;
use warnings;

my $cadena = "Cadena de Tux";

if ($cadena =~ /[T]/){
print "Se encontro T en $cadena \n";
}
else{ print "No se encontró T en $cadena \n"; }

Como dije no busca en al principio,recorre toda la cadena,ahora si queremos buscar al principio solamente agregamos ^ a la sintaxis


#!/usr/bin/env perl 

# Caracteres,expresiones regulares 3---{

use strict;
use warnings;

my $cadena = "Cadena de Tux";

if ($cadena =~ /^[T]/){
print "Se encontro T en $cadena \n";
}
else{ print "No se encontró T en $cadena \n"; }


También hay que tener en cuenta que estamos buscando una T mayúscula ya que si la cadena fuera en minúsculas no la reconocería para no distingir en mayúsculas y minúsculas solo tenemos que indicarlo en la sintaxis con i :


if ($cadena =~ /^[c]/i){
Supogamos que ahora queremos verificar que la cadena contenga la letra c en el principio de la cadena y no importa si es mayúscula o minúscula:

#!/usr/bin/env perl 

# Caracteres,expresiones regulares 4---{

use strict;
use warnings;

my $cadena = "Cadena de Tux";

if ($cadena =~ /^[c]/i){
print "Se encontro T en $cadena \n";
}
else{ print "No se encontró T en $cadena \n"; }

Veamos un ejemplo mas funcional,buscar una palabra que sea tomada desde la entrada estándar y con verificadores de longitud;



#!/usr/bin/env perl 

# Caracteres,expresiones regulares 5---{

use strict;
use warnings;

system("clear");

my $cadena = "Tiempo de Tux";
my $respuesta;
print "Que palabras desea buscar: ";

my $palabras = <>;

chop($palabras);

if ($cadena =~ /[$palabras]/i){
    if ( length($palabras) == 1 ) { 
print"Se econtro la palabra $palabras en la cadena\n"; }else{ 
print "Se econtraron las palabras $palabras en cadena\n"; }
           system("sleep 1");
print "Desea ver la cadena? s/n: ";
$respuesta = <>;
chop($respuesta);
if ( $respuesta eq "s" ) { print "La cadena es : $cadena\n"; }
elsif( $respuesta eq "n" ) { print "Sera despues :D\n"; }else{
print "Ok\n";
}
}

elsif ( $cadena !~ /[$palabras]/i ) { 
if ( length($palabras) != 1 ) { 
print "No se encotraron $palabras en cadena\n"; }else{ 
print "No se encontro $palabras en cadena\n"; }
}

END






Ejecuten y analicen el código para una mayor comprensión, si no entiendes bien checa los otros tutoriales del sitio aqui.

Inicio y final de cadena

Como vimos el carácter ^ da inicio a la cadena,indica que verifique en el inicio de la cadena

Por ejemplo

my $texto = "FreeBSD";

if ($texto =~ /^Fr/ ) { print "Se encontró Fr al principio de $texto\n"; }

Esto también verificaría Francia,Freeware,Freelance,etc

Pero si lo queremos verificar el final?

Solo debemos usar esta sintaxis:

 /texto$/
Esto indica el final de la cadena o texto, así como ^ indica el inicio


my $texto = "FreeBSD";

if ($texto =~ /BSD$/ ) { 
print "Se encontró BSD al final de $texto\n"; }

Esto encontrara openBSD,ghostBSD, pero no BSDlicence

Aquí el ultimo ejemplo:



#!/usr/bin/env perl 

# Inicio y final de cadena,expresiones regulares 6---{

use strict;
use warnings;

system("clear");

my $cadena = "FreeBSD";
my $respuesta;
my $res;
print "Que palabras desea buscar al principio: ";

my $palabras = <>;

chop($palabras);

if ($cadena =~ /^$palabras/i){
    if ( length($palabras) == 1 ) { 
print"Se econtro la palabra $palabras eal principio de la cadena\n"; }else{ 
print "Se econtraron las palabras $palabras al principio de la cadena\n"; }
&respuesta();
}

elsif ( $cadena !~ /^$palabras/i ) { 
if ( length($palabras) != 1 ) { 
print "No se encotraron $palabras al principio de la cadena\n"; 
                &res();
}else{ 
print "No se encontro $palabras al principio de la cadena\n"; }
&res();
}

sub respuesta {

system("sleep 1");
print "Desea ver la cadena? s/n: ";
$respuesta = <>;
chop($respuesta);
if ( $respuesta eq "s" ) { print "La cadena es : $cadena\n"; exit; }
elsif( $respuesta eq "n" ) { print "Sera despues :D\n"; exit; }else{
print "Ok\n"; exit; }

}

sub res {
print "Desea buscar $palabras en el final de la cadena: s/n :";
$res = <>;
chop($res);
if ( $res eq "s" ) { 
if ( $cadena =~ /$palabras$/i) { 
print "Se encontro $palabras al final de la cadena\n"; &respuesta(); }
else { 
print "No se encotro $palabras al final de  la cadena\n"; exit; }
}
elsif ( $res eq "n" ) { print "Sera despues :D\n"; exit; } else {
print "Ok\n"; exit; }
}

END


Eso es todo,ejecuten y analicen,en la ultima parte veremos algo mas avanzado asi que sera en unas semanas para digerir bien esto.




No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.