[perl] cadenas, busqueda y sustitucion

Bolo Lacertus lacertus@servidor.unam.mx
Tue, 10 Oct 2000 11:15:53 -0500


Saludos!!!

Ok, debes revisar con calma la parte de las expresiones regulares, es un
tanticuanto dificil, pero bien vale la pena.

Cesar Villegas wrote:
> como puedo hacer para que eliminar todo lo que no este entre < > de cada
> una de las lineas???

Pasando a la pregunta concreta, una forma es usar cadenas regulares para
identificar lo que este entre picoparentesis y eliminarlo (subsituirlo
por otra cosa estrictamente).

Ok, vamos evolucionando la cosa para que no sea tan misteriosa...

Supongamos por un momento que la cadena a cambiar es siempre <mama> ,la
forma de substituirlo por "" en una cadena almacenada en $renglon es:

$renglon=~s/\<mama\>//;
(notese que mas vale escapar los caracteres especiales, y que si
quisiera cambiarlo por papa sería: $renglon=~s/\<mama\>/\<papa\>/g

Ok, pero no siempre es "mama" quiero que atrape cualquier cosa entre <>:
$renglon=~s/\<.*\>//;
("." quiere decir, cualquier caracter, y "*" cualquier número de veces
(0 a todas) de modo que estas diciendo "cuanto haya entre el "<" y el
">".
Notese sin embargo, que si hay mas de uno, como en "esta <por> es <asi>"
te dejará solo con "esta " como resultado ya que toma el primer "<" y el
último ">".)

Como queremos que tome los primeros "<" y ">" que pueda cambiamos a:
$renglon=~s/\<.*?\>//;
(El "?" adicional, le dice al "*" que tome cuantos quiera, pero que sean
los menos posibles para hacer la expresión verdadera, de modo que con la
cadena anterior nos deja: "esta  es <asi>".

Pero queremos que detecte y elimine la segunda cadena y no solo la
primera, para eso, hay un modificador de la operación de substitución
que dice que reemplazemos tantas ocurrencias como haya, lo que resulta:
$renglon=~s/\<.*?\>//g;

Y esto ya debe hacer lo que deseas. Aunque por supeusto, no sobra el
saber que estaba diciendo la expreción, como es un adendo, para abreviar
solo digamos que es:
$renglon=~s/\<(.*?)\>//g;
Y el contenido queda en la variable $1.

Esperando ser lo bastante explicativo y sin embargo lo suficientemente
concreto
-- 
Bolo Lacertus: lacertus@servidor.dgsca.unam.mx		==~\___\
http://proteo.dgsca.unam.mx/cgi-bin/lacertus/hola	 =__vvvv
--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : unsubscribe perl