> Hola listeros,

Hola listera!

> Ando muy entretenida ;-) parseando unos bonitos logs ;-) y tengo un
> problema que seguro que es la tonter�a m�s grande del mundo.
>
> Tengo una expresi�n regular y necesito que haga un poco m�s:

A ver, a machetearle un poco...

> (...)

>               # Esto es lo que necesito que me encuentre:
>               # La l�nea debe empezar por el contenido de la variable $id.
>               $line = ~/^\$id\|.*?\|.*?\|.*?\|.*?\|.*?\|(.*?.)\|.*/;
>               #####################################################
>               #         ~~~~~ C�mo escribo esto????
>               #####################################################

Primero que nada, tu duda: Puedes poner una variable dentro de una
expresi�n regular sin sintaxis especial alguna - La expresi�n regular la
interpola como si fueran comillas dobles. Corrijo el operador que usas,
adem�s: Est�s d�ndole $line = ~/(...), cuando el operador correcto es =~
Lo que t� est�s haciendo puede ser alguna expresi�n idiom�tica rara (y
Perl la ve como v�lida, pero entiendo que est� haciendo una asignaci�n por
ah�)... Pero por legibilidad y mantenibilidad (?) futura, te sugiero usar
=~

$line =~ /^$id\|.*?\|.*?\|.*?\|.*?\|.*?\|(.*?.)\|.*/;

Ahora, te sugiero modificar esto en pro de la legibilidad. Vamos por
partes:

- En cada elemento de tu l�nea de bit�cora, basta con que preguntes por
  .*, la interrogaci�n que le est�s poniendo es sup�rflua. Si no me
  equivoco, en el sexto que tomas, necesitas que en vez de cero o m�s
  caracteres capture uno o m�s, �cierto? En vez de hacer .*. puedes darle
  .+

   $line =~ /^$id\|.*\|.*\|.*\|.*\|.*\|(.+)\|.*/;

- Est�s buscando un patr�n .*\| cinco veces. �Por qu� no usar un
  cuantificador? Si usas (.*\|){5} queda m�s legible.
  Ahora, yo a esto le agrego, por velocidad (y porque no estoy seguro del
  comportamiento de los par�ntesis de captura con un cuantificador) un ?:
  al principio de este sub-patr�n, para que use estos par�ntesis para
  agrupar �nicamente, y no para capturar. Quedamos entonces con:

   $line =~ /^$id\|(?:.*\|){5}(.+)\|.*/;

- �Te importa lo que ocurra despu�s de encontrar a tu $encontrado? No
  creo... Pero se lo est�s exigiendo a Perl. S�, le est�s exigiendo algo
  muy simple, pero no lo requieres. Va, pues, para afuera:

   $line =~ /^$id\|(?:.*\|){5}(.+)\|/;

- Legibilidad, importante, muy importante. Por lo que dices, t� no eres
  experta en expresiones regulares, y no sabes qui�n va a darle
  mantenimiento en un futuro - Usa el modificador /x, y comenta tu
  expresi�n. Este modificador te permite meter espacio en blanco y
  comentarios sin que afecten a la expresi�n:

   $line =~ /^$id\|       # Que inicie con el identificador
              (?:.*\|){5} # Cinco campos que no me importan
              (.+)\|      # De ac� estoy tomando $encontrado
            /x;

�Te gusta m�s as�? ;-)

>               $encontrado = $+ ;

Es ligeramente m�s r�pido y m�s claro usar $1 (explicitar que es el primer
caso encontrado exitosamente) a usar $+ (el siguiente - en este caso, el
primero).

>               if($encontrado){
>                      print $encontrado, "\n";
>               }

�Vas a seguir usando $encontrado despu�s de aqu�? Si no, �por qu� no
evitarte la creaci�n de la variable?

...Adem�s, se nota que vienes de C ;-) Yo pondr�a esto directamente
despu�s de tu expresi�n en vez de todo lo que pusiste:

print "$1\n" if $1;

> Estoy empezando tanto con Perl como con las regexp y me cuesta un poco.
> Gracias por vuestro tiempo :-)

As�mate a perldoc perlre, tiene TODO lo que quieras saber al respecto.

Saludos,

-- 
Gunnar Wolf - [EMAIL PROTECTED] - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF


Responder a