Tutorial de PERL en castellano : Purgando los pecados. |
Pero ya puestos... Preguntas frecuentemente preguntadas Bibliografía. Recursos Internet Recordando, que es gerundio |
No es precisamente lo que tenía en mente nuestro político
cuando decidió ver como aumentaba su capital con cada aportación
de su clientela; o sea, que hacer un programilla en PERL para calcular
sumas parciales, y sumas totales, no estaría mal; quizás
incluso podía añadirle que sonara una campanita cada vez
que sume cien talegos más. Así pues, hace el programa purga.pl
,
para aplicarlo sobre el fichero clientes.mas
while(<>) { split(/ /); print "Total parcial ", $total+=$_[1], ",\n"; }
que divide cada línea en sus componentes separados por espacios, y suma el segundo componente, índice 1 de la matriz. Pero cual no sería su desagradable sorpresa al ver que el dinero no aumentaba, sino que daba este resultado:
C:\PROGS\PERL>purga.pl clientes.mas perl purga.pl clientes.mas Total parcial 150000, Total parcial 474999.75, Total parcial 598454.75, Total parcial 1154120.75, Total parcial 1699441.75, Total parcial 1699441.75, Total parcial 1699441.75,
¡Diablos! 3 clientes no habían aportado su granito de arena
a la grandeza del partido. ¿Cómo podía ser eso? Por
mucho que lo ejecutaba no funcionaba de otra manera (como es natural),
así que tuvo que aprender a manejar algo llamado purgante o purgador
o algo así. Para ejecutarlo, hay que añadir la opción
-d
en la línea de comandos al llamar al
PERL o la primera
línea del script en UNIX:
perl -d purga.pl clientes.mas Loading DB routines from perl5db.pl patch level 0.95 Emacs support available. Enter h or `h h' for help. main::(purga.pl:1): while(<>) { DB<1>
Este es el depurador o debugger
de PERL, con el cual se puede hacer lo habitual en
cualquier depurador,
aunque quizás de una forma un poco menos amistosa
Supuestamente, se puede usar desde emacs, aunque yo no he visto
ninguna ventaja en ello. Sin embargo, desde xemacs
es
mucho más fácil de usar; se accede directamente desde la opción
Perl->Debugger
del menú.. También se puede usar el ActivePerl
Development Kit, de ActiveState, pero todavía no lo he usado tampoco . Por ejemplo,
se pueden poner puntos de ruptura con b
(breakpoint), para examinar qué es lo que va mal:
DB<1> b 3
Al ejecutar el programa con c
(continuar) o r
(ejecutar), el programa
parará en esa línea:
DB<2> r main::(purga.pl:3): print "Total parcial ", $total+=$_[1],",\n";
imprimiendo la línea de que se trata. Entonces podemos
examinar variables, matrices o lo que se tercie, con la orden p
,
de print o imprimir. Incluso, con la orden <
,
nos ejecuta un comando antes de pararse, por ejemplo:
DB<3> < print $_[1]
Al llegar a las líneas problemáticas, nos encontramos que
main::(purga.pl:3): print "Total parcial ", $total+=$_[1], ",\n"; Bacterio DB<5> c Total parcial 1699441.75, main::(purga.pl:3): print "Total parcial ", $total+=$_[1], ",\n"; DB<5>
De esta forma, observamos que
en algunos casos, no se cumple que el segundo componente sea numérico:
en un caso es una cadena, y en otro caso nada... Si nos fijamos en el fichero
original, vemos que hay dos espacios tras Ofelia (será para hacerle
sitio), con lo cual PERL, con toda su ilusión, divide la línea
y no mete nada entre ellas. En realidad, esa línea es bastante rara,
porque además aparece dos veces la cantidad, pero es igual. En cualquier
caso, eso nos dice que en vez de usar el segundo componente desde el principio,
debemos de usar el tercero desde el final, es decir, $_[$#_-2]
.
Con lo cual el programa funciona perfectamente, y nuestro político
lo ha purgado.
En realidad, el debugger de PERL es bastante potente, a pesar de su presencia espartana, sobre todo porque incluye un intérprete y puede ejecutar sobre la marcha cualquier expresión. Incluso es aconsejable ejecutar un programa la primera vez desde este depurador, para corregir sobre la marcha cualquier problema.
El resto de las órdenes del depurador, que incluyen puntos de
ruptura condicional, ejecución paso a paso (con s
o simplemente dándole a enter), se consiguen con el comando de ayuda,
h
.
[ Pero ya puestos...] [ Preguntas frecuentemente preguntadas] [ Bibliografía.] [ Recursos Internet] [ Recordando, que es gerundio] |