<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE html
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=uft8">
   <META NAME="DATE" CONTENT="11/2/2003">
   <META NAME="Author" CONTENT="J. J. Merelo">
   <META NAME="Description" CONTENT="Tutorial de PERL en castellano, con ejemplos y ejercicios">
   <META NAME="Keywords" CONTENT="curso de perl, tutorial de perl, manual de perl, programacion"> 
   <TITLE>Tutorial de Perl:  Purgando los pecados.  </TITLE>
<script language="JavaScript">
var contador = 1;
var contadores= new Array;
function multicontador(  numero ) {
      if ( ! contadores[ numero ]  )
          contadores[ numero ] = 1;
      else
          contadores[numero ]++;
      document.write( contadores[numero] );
};

</script>
<link rel ='stylesheet' type = "text/css" href = "perl.css">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#ffffff" LINK="#0000FF" VLINK="#551A8B" ALINK="#FF0000">
<TABLE  align=center cellpadding=5 bgcolor='darkseagreen'>
	<tr>

	<td>
			 <!-- Atomz.com Search HTML for Tutorial de PERL en castellano -->
	  <form method="get" action="http://search.atomz.com/search/">
	    <input size=25 name="sp-q"><br /><input type=submit value="Busca en el tutorial">
	    <input type=hidden name="sp-a" value="0002147b-sp00000001">
	  </form>
	</td>

	<td align='center'>
			<h1><a href='indice.html'>Tutorial de <strong>PERL</strong> en castellano </a>: Purgando los pecados.</h1>
	</td>

    <td align='right' valign='top'><a href='tutoperl9.html'> Pero ya puestos...</a><br><a href='tutoperl16.html'> Preguntas frecuentemente preguntadas</a><br><a href='tutoperl17.html'> Bibliograf&iacute;a.</a><br><a href='tutoperl18.html'> Recursos Internet</a><br><a href='tutoperl7.html'> Recordando, que es gerundio</a><br></td>
	</tr>
</table>

<h3>Usando el depurador</h3>



<P>No es precisamente lo que ten&iacute;a en mente nuestro pol&iacute;tico
cuando decidi&oacute; ver como aumentaba su capital con cada aportaci&oacute;n
de su clientela; o sea, que hacer un programilla en <strong>PERL</strong> para calcular
sumas parciales, y sumas totales, no estar&iacute;a mal; quiz&aacute;s
incluso pod&iacute;a a&ntilde;adirle que sonara una campanita cada vez
que sume cien talegos m&aacute;s. As&iacute; pues, hace el programa <code>purga.pl</code>,
para aplicarlo sobre el fichero <a href=clientes.mas><code>clientes.mas</code></a><pre>
while(&lt;>) {
    split(/ /);
    print "Total parcial ", $total+=$_[1], ",\n";
}</pre>

<P>que divide cada l&iacute;nea en sus componentes separados por espacios,
y suma el segundo componente, &iacute;ndice 1 de la matriz. Pero cual no
ser&iacute;a su desagradable sorpresa al ver que el dinero no aumentaba,
sino que daba este resultado:<pre>
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,
</pre>

<P>&iexcl;Diablos! 3 clientes no hab&iacute;an aportado su granito de arena
a la grandeza del partido. &iquest;C&oacute;mo pod&iacute;a ser eso? Por
mucho que lo ejecutaba no funcionaba de otra manera (como es natural),
as&iacute; que tuvo que aprender a manejar algo llamado purgante o purgador
o algo as&iacute;. Para ejecutarlo, hay que a&ntilde;adir la opci&oacute;n
<code>-d</code> en la l&iacute;nea de comandos al llamar al
<strong>PERL</strong> o la primera 
l&iacute;nea del script en UNIX:</p><pre>
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(&lt;>) {
DB&lt;1> </pre>

<p>Este es el depurador o <I>debugger</I>
de <strong>PERL</strong>, con el cual se puede hacer lo habitual en
cualquier depurador, 
aunque quiz&aacute;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 <code>xemacs</code> es
mucho más fácil de usar; se accede directamente desde la opción
<code>Perl->Debugger</code> del menú.. También se puede usar el ActivePerl
Development Kit, de <a href=http://www.activestate.com>ActiveState</a>, pero todavía no lo he usado tampoco . Por ejemplo,
se pueden poner puntos de ruptura con <code>b</code>
(<I>breakpoint</I>), para examinar qu&eacute; es lo que va mal:</p><pre><code>
DB&lt;1> b 3</code></pre>
<p>Al ejecutar el programa con <code>c</code>
(continuar) o <code>r</code> (ejecutar), el programa
parar&aacute; en esa l&iacute;nea:<pre> 
DB&lt;2> r
main::(purga.pl:3): print "Total parcial ", $total+=$_[1],",\n";
</pre><p>imprimiendo la l&iacute;nea de que se trata. Entonces podemos
examinar variables, matrices o lo que se tercie, con la orden <code>p</code>,
de print o imprimir. Incluso, con la orden <code>&lt;</code>,
nos ejecuta un comando antes de pararse, por ejemplo:</p><pre>
DB&lt;3> &lt; print $_[1]
</pre><p>Al llegar a las l&iacute;neas problem&aacute;ticas,
nos encontramos que<pre>
main::(purga.pl:3): print "Total parcial ", $total+=$_[1], ",\n";
Bacterio DB&lt;5> c
Total parcial 1699441.75,
main::(purga.pl:3): print "Total parcial ", $total+=$_[1], ",\n";
DB&lt;5> 
</pre>
<p>De esta forma, observamos que
en algunos casos, no se cumple que el segundo componente sea num&eacute;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&aacute; para hacerle
sitio), con lo cual <strong>PERL</strong>, con toda su ilusi&oacute;n, divide la l&iacute;nea
y no mete nada entre ellas. En realidad, esa l&iacute;nea es bastante rara,
porque adem&aacute;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, <code>$_[$#_-2]</code>.
Con lo cual el programa funciona perfectamente, y nuestro pol&iacute;tico
lo ha purgado.
</p>

<P>En realidad, el debugger de <strong>PERL</strong> es bastante
potente, a pesar de su 
presencia espartana, sobre todo porque incluye un int&eacute;rprete y puede
ejecutar sobre la marcha cualquier expresi&oacute;n. Incluso es aconsejable
ejecutar un programa la primera vez desde este depurador, para corregir
sobre la marcha cualquier problema.
</p>

<P>El resto de las &oacute;rdenes del depurador, que incluyen puntos de
ruptura condicional, ejecuci&oacute;n paso a paso (con <code>s</code>
o simplemente d&aacute;ndole a enter), se consiguen con el comando de ayuda,
<code>h</code>.</p>



<TABLE  align=center cellpadding=5 bgcolor='darkseagreen'><tr><td>[<a href='tutoperl9.html'> Pero ya puestos...</a>] [<a href='tutoperl16.html'> Preguntas frecuentemente preguntadas</a>] [<a href='tutoperl17.html'> Bibliograf&iacute;a.</a>] [<a href='tutoperl18.html'> Recursos Internet</a>] [<a href='tutoperl7.html'> Recordando, que es gerundio</a>] </td></tr></table>

</BODY>
</HTML>
