[perl] cadenas, busqueda y sustitucion
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Tue, 10 Oct 2000 11:18:25 -0500 (CDT)
> Recien empiezo con Perl y tambien es mi primer mensaje en la lista :)
>
> Quisiera saber como puedo buscar una cadena y reemplazarla por otro sin
> importar su extension, imaginemos que tengo un archivo de texto con
> muchas oraciones....
>
> mi <mama me> mima
> yo amo a mi <mama> mucho
> mi <mama es la mejor> del mundo
>
> como puedo hacer para que eliminar todo lo que no este entre < > de cada
> una de las lineas???
>
> estoy practicando con pequeños ejercicios como este, tengo el libro
> Learning Perl y con ese me guio un poco, apenas resuelva esto quiero
> hacer un extractor de links ;)
¡Bienvenido al mundo maravilloso de las expresiones regulares! En este
mundo, todo parece magia negra, pero tras aprender como se usan, es lo mas
sencillo y util del mundo. Yo haria:
@a = ('mi <mama me> mima',
'yo amo a mi <mama> mucho',
'mi <mama es la mejor> del mundo');
for ($i = 0; $i <= $#a; $i++) {
$a[$i] =~ s/.*\<(.*)\>.*/$1/;
}
Explico:
Primeras tres lineas: Crear el arreglo.
Cuarta y sexta lineas: Definicion del ciclo. Para darle vuelta a todo el
arreglo utilizo $#a - $#arreglo te da el numero de elementos que hay en
@arreglo.
Quinta linea: La magia, la expresion regular. El operador =~ indica que
sigue una expresion regular, s indica que sera de substitucion, y la
expresion esta contenida entre las diagonales (/). La expresion
regular? Claro. La reproduzco:
s/.*\<(.*)\>.*/$1/
.* significa 'cero o mas caracteres cualquiera'. Lo vemos en tres lugares
- el primero y el ultimo son para que podamos descartar todo lo que va
antes de y despues de lo que buscamos. El segundo va entre parentesis, lo
que hace que su valor sea retenido en la variable especial $1. No tengo a
la mano la tabla de caracteres que puedes poner dentro de una expresion
regular, asi que en vez de meter la pata, estoy escapando < y > con \.
En español, la expresion que puse significa:
Substituye todo lo que tenga un signo < seguido de texto que recordaras
( s/ ) ( .*\< ) ( (.*) )
y seguido de otro signo > y quien sabe que mas por lo que recordaste.
( \>.* ) (/) ( $1 )
Claro, esta es una expresion muy sencilla. No funcionara, por ejemplo, si
tienes 'mi <mama> es la <mejor mama> de todas <las mamas>'. Pero es un
punto de inicio.
-------------------------------------------------------------------
Gunnar Wolf gwolf@campus.iztacala.unam.mx
Universidad Nacional Autónoma de México, Campus Iztacala
Jefatura de Sección de Desarrollo y Admon. de Sistemas en Red
Departamento de Seguridad en Computo - DGSCA - UNAM
-------------------------------------------------------------------
Beginner thinks 1Kb == 1000 bytes. Master knows 1Km == 1024m
--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text : unsubscribe perl