Gunnar Wolf dijo:
> Primero que nada, tu duda: Puedes poner una variable dentro de una
> expresi�n regular sin sintaxis especial alguna
Eso me lo vas a tener que demostrar porque yo ya no me lo creo ;-)
He perdido la f� completamente!!!
> - 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 =~
Jajaja... eso es lo que pasa cuando programas "de o�do" ;-)
> $line =~ /^$id\|.*?\|.*?\|.*?\|.*?\|.*?\|(.*?.)\|.*/;
Ack.
> - 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\|.*\|.*\|.*\|.*\|.*\|(.+)\|.*/;
Ack. Lo pruebo y te cuento.
> - 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}(.+)\|.*/;
�Se supone que esto es m�s legible? No s� qu� decir :-)
> - �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}(.+)\|/;
Ok, perfecto. Lo que venga despu�s lo desecho, por tanto as� queda m�s
cortito.
> - Legibilidad, importante, muy importante.
Entre t� y yo, no te me ofendas. �Legibilidad? Esto es Perl. Y
expresiones regulares! XDDD
Despu�s de ver en los tutoriales cosas com $_, $., $+... Perl no
coincide con mi concepto de legible :-))))
> Por lo que dices, t� no eres experta en expresiones regulares, y no
> sabes qui�n va a darle mantenimiento en un futuro
Lamentablemente lo s�: yo. Y te aseguro que con el orgullo que tengo lo
voy a dejar bonito. Porque ahor lo estoy migrando de bash a Perl, y me
funciona, pero muy pobre en rendimiento. Y como se me meta a m� entre
ceja y ceja aprender a hacer esto, que no puede ser tan dif�cil, digo
yo, que no es Inteligencia Artificial... ;-)
> - 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;
Eso s� me parece m�s legible, ahora empezamos a hablar el mismo idioma
:-)
> �Te gusta m�s as�? ;-)
SIIII� :-)
> 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).
Perfecto. Putos tuttoriales... :-)
> �Vas a seguir usando $encontrado despu�s de aqu�? Si no, �por qu� no
> evitarte la creaci�n de la variable?
S�, lo voy a usar: imag�nate que
$encontrado = $app ;
#if ($line_tmp[0] eq $id){ # -> si uso split
if ($line =~ /regex horrible/x){ # -> tengo que probarlo
#$app = $line_tmp[6]; # -> split
$app = $1 # -> lo que me de la regex
# Esto es porque estoy de debug y quiero verlo:
print $id, " - ", $line_tmp[0], " - ", $app, "\n" ;
}
if($app){
print $app, "\n";
}else{$app="Otras";} # Si la app no tiene nombre, al ba�l.
$aplis{$app}++; # las cuento
Y luego lo meto en una hoja de c�culo Gnumeric, con otro script que me
hizo mi querido amigo H�ctor, que me meti� el vicio de Perl en la sangre
:-)
> ...Adem�s, se nota que vienes de C ;-)
C�mo lo sabes? C fue mi primer lenguaje, pero nunca hice nada serio ni
medianamente dif�cil. Me sirvi� para aprender un poquito de metodolog�a.
Luego PHP, que se traga perfectamente el estilo de C. Luego tuve una
crisis y volv� a Bash. Y despu�s de coquetear con Python, ganador de mi
coraz�n, he querido espiar al "enemigo". Perl me recuerda al PHP pero en
ilegible, es write only :-)
De todas formas, soy un desastre programando. Soy de letras. No hay
pensamiento l�gico en mi pobre neurona.
> Yo pondr�a esto directamente despu�s de tu expresi�n en vez de todo lo
> que pusiste: print "$1\n" if $1;
Lo meto en $app y, en mi array o hash o lo que sea eso que uso para
contar cuantas veces aparece cierta aplicaci�n, incremento el contador.
> As�mate a perldoc perlre, tiene TODO lo que quieras saber al respecto.
La cantidad de informaci�n abruma, otra cosa es que la entienda :-)
Pero reconozco que me estoy viciando.
--
.''`. Girl, you gotta change your crazy ways, you hear me?
: :' : Crazy by Aerosmith
`. `' Proudly running Debian GNU/Linux (Sid + 2.4.20 + Ext3)
`- www.amayita.com www.malapecora.com www.chicasduras.com