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