[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