<?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:  Decodificando  </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>: Decodificando</h1>
	</td>

    <td align='right' valign='top'><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='tutoperl11.html'> Presentando lo impresentable</a><br><a href='tutoperl13.html'> Todo bajo control</a><br></td>
	</tr>
</table>

<h3>Usando <code>pack</code> y <code>unpack</code></h3>



<P>En realidad, la contrataci&oacute;n de este nuevo genio de la inform&aacute;tica,
al que ya le est&aacute; buscando tambi&eacute;n colocaci&oacute;n en la
empresa que controla los ordenadores de la campa&ntilde;a electoral, le
ha dejado alg&uacute;n tiempo libre a nuestro [censurado] pol&iacute;tico.
Para emplear este tiempo libre, decide conectarse con eso que le ha dicho
su amigo Borrell, que se llama internez o algo as&iacute;; dentro de la
internez, y de una parte especialmente yanqui llamada usanez o algo as&iacute;,
hay unos grupos de discusi&oacute;n de temas de m&aacute;xima actualidad.
En concreto, un grupo denominado <code>alt.binaries.pictures.erotica.politics</CODE>
publica interesantes fotos de pol&iacute;ticas de la oposici&oacute;n en
actitud de debate (al menos eso es lo que le han contado).
</p>

<P>Pero su gozo se encuentra en un pozo cuando s&oacute;lo ve letras y
m&aacute;s letras en los mensajes que le van llegando. Su inform&aacute;tico
residente le explica que vienen codificadas con un programa denominado
<code>uuencode</CODE>, y que tiene que salvarlas cada una
por separado y decodificarlas despu&eacute;s, antes de verlas. Con la pericia
que dan las ganas, escribe el siguiente programa, <a href=uudec.pl><code>uudec.pl</CODE>.</a>

<table class=listado align=center cellspacing=0 border=0 cellpadding=1><tr><td
bgcolor=black><table cellspacing=0 border=0 cellpadding=2 width=100%><tr><td bgcolor=white>
<pre><font size=+2>
1&nbsp;#<em>!/usr/bin/perl
</em>2&nbsp;
3&nbsp;<font color=blue>while</font>( &lt;<font color=green>$ARGV</font>[0]&gt;) {
4&nbsp;      	
5&nbsp;    <font color=red>open</font>( IN, "&lt;<font color=green>$_</font>" );
6&nbsp;    <font color=blue>while</font> (&lt;IN&gt;) {
7&nbsp;	<font color=blue>if</font> ( /begin \d+\s+(\S+)/ ) {
8&nbsp;	    <font color=green>$fileName</font> = <font color=green>$1</font>;	
9&nbsp;	    <font color=red>open</font> ( OUT, "&gt;<font color=green>$fileName</font> );
10&nbsp;	}			
11&nbsp;	<font color=red>print</font> OUT, <font color=red><font color=red>unpack</font></font>("u",$_) <font color=blue>if</font> /^[MC]/;
12&nbsp;    }			
13&nbsp;}
14&nbsp;<font color=red>close</font> OUT;
</font></pre>
</td></tr></table></td></tr><caption><font face="arial,helvetica">Listado <script>multicontador(1);</script>: Programa uudec.pl</font></caption></table>



<P>Este programa utiliza la orden <code>unpack</CODE> para
decodificar cadenas, y las escribe en salida est&aacute;ndar. La descripci&oacute;n
es incluso m&aacute;s corta que el programa. Los mensajes en ciertos foros
de USENET vienen divididos en varias partes, cada una de las cuales contiene
un pedazo de un fichero codificado con <code>uuencode</CODE>
(puede ser un .GIF, un .WAV o cualquier otro). Para usar el programa, se
salvan todas las partes del mensaje correlativamente en un fichero. El
programa busca primero el nombre del fichero codificado, que aparece en
una l&iacute;nea de la forma<code>begin 644 nomfich.gif</CODE>,
abre un fichero con ese nombre, y va escribiendo en &eacute;l las cadenas
decodificadas.
</p>

<P>Para llamar a este fichero, se escribe<pre>
UNIX% uudec.pl fichero.uu
</pre><p>y se crea el fichero
codificado, que luego podr&aacute; uno contemplar con su visor de GIFs
preferido (o escuchar con la SoundBlaster). Se pueden dar comodines en 
la línea de comandos; el bucle lo irá abriendo uno por uno.
</p>

<P>En realidad, la orden <code>unpack</CODE> decodifica
de formatos de codificaci&oacute;n internos a cadenas; la orden <code>pack</CODE>
hace exactamente lo contrario. La utilidad de todo esto se me escapa un
poco, salvo que, por ejemplo, se quieran almacenar n&uacute;meros reales
de forma que pueda leerlos directamente un programa en C. En ese caso,
se escribir&iacute;a<Pre>
print pack( "f", $zipi);
</pre><p>Un n&uacute;mero
real escrito as&iacute; se podr&iacute;a leer directamente con la orden
<code>read</CODE> del C (pero, ojo, no con la <code>scanf</CODE>,
que sirve solamente para ficheros de texto). Otra forma de usarlo es
para formatear ficheros de salida; usando <pre>print
pack("A7",$cadena)</pre><p>, haremos que la salida ocupe justamente 7
caracteres,ni más mi menos; así aparecerá todo en bonitas
columnas. Por ejemplo, nuestro archiconocido memoria.pl se podría
convertir en este <a href=memoria-col.pl>memoria-col.pl</A>
</p>

<table class=listado cellspacing=0 border=0 cellpadding=1><tr><td
bgcolor=black><table cellspacing=0 border=0 cellpadding=2 width=100%><tr><td bgcolor=white>
<pre><font size=+2>
1&nbsp;#<em>!/usr/bin/perl
</em>2&nbsp;<font color=blue>until</font>(0) {
3&nbsp;     <font color=red>print</font> "Cliente, cantidad\n";
4&nbsp;     <font color=red>chop</font>(<font color=green>$_</font> = &lt;&gt;); 
5&nbsp;     <font color=blue><font color=blue>last</font></font> <font color=blue>if</font> !<font color=green>$_</font>;
6&nbsp;     (<font color=green>$paganini</font>, <font color=green>$cantidad</font>) = <font color=red>split</font>(/,/,<font color=green>$_</font>);
7&nbsp;     <font color=green>$comision</font> = <font color=green>$cantidad</font> * 0.25;
8&nbsp;     (<font color=green>$seg</font>, <font color=green>$min</font>, <font color=green>$hora</font>, <font color=green>$dia</font>, <font color=green>$mes</font>, <font color=green>$anho</font>, <font color=green>@zape</font>) = <font color=red>localtime</font>(<font color=red>time</font>);
9&nbsp;     <font color=green>$mes</font>++;
10&nbsp;     <font color=green>$zipi</font> = <font color=red><font color=red>pack</font></font>("A16",<font color=green>$paganini</font>).<font color=red><font color=red>pack</font></font>("A7",<font color=green>$comision</font>)."<font color=green>$hora</font>:<font color=green>$min</font> <font color=green>$dia</font>/<font color=green>$mes</font>\n";
11&nbsp;     <font color=red>push</font>( <font color=green>@mem</font>, <font color=green>$zipi</font> );     
12&nbsp;};
13&nbsp;
14&nbsp;<font color=red>print</font> <font color=green>@mem</font>;
</font></pre>


</td></tr></table></td></tr><caption><font
face="arial,helvetica">Listado <script>multicontador(1);</script>:
Programa memoria-col.pl</font></caption></table>

<p>Este programa, sobre el fichero siguiente</p><pre>
uno, 1605168
este es el dos, 166166
este puede ser el tres, 1616136
</pre><p> produciría la siguiente salida</p> <pre>
uno             401292 19:54 25/7
este es el dos  41541.519:54 25/7
este puede ser e404034 19:54 25/7
</pre><p> (dependiendo, claro está, de cuando se hayan producido las
susodichas transacciones cambiarán horas y fechas).</p>




<TABLE  align=center cellpadding=5 bgcolor='darkseagreen'><tr><td>[<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='tutoperl11.html'> Presentando lo impresentable</a>] [<a href='tutoperl13.html'> Todo bajo control</a>] </td></tr></table>

</BODY>
</HTML>
