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