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

Responder a