> 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