Tutorial de PERL en castellano : Decodificando

Preguntas frecuentemente preguntadas
Bibliografía.
Recursos Internet
Presentando lo impresentable
Todo bajo control

Usando pack y unpack

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

Pero su gozo se encuentra en un pozo cuando sólo ve letras y más letras en los mensajes que le van llegando. Su informático residente le explica que vienen codificadas con un programa denominado uuencode, y que tiene que salvarlas cada una por separado y decodificarlas después, antes de verlas. Con la pericia que dan las ganas, escribe el siguiente programa, uudec.pl.


1 #!/usr/bin/perl
2 
3 while( <$ARGV[0]>) {
4       	
5     open( IN, "<$_" );
6     while (<IN>) {
7 	if ( /begin \d+\s+(\S+)/ ) {
8 	    $fileName = $1;	
9 	    open ( OUT, ">$fileName );
10 	}			
11 	print OUT, unpack("u",$_) if /^[MC]/;
12     }			
13 }
14 close OUT;
Listado : Programa uudec.pl

Este programa utiliza la orden unpack para decodificar cadenas, y las escribe en salida estándar. La descripción es incluso má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 uuencode (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ínea de la formabegin 644 nomfich.gif, abre un fichero con ese nombre, y va escribiendo en él las cadenas decodificadas.

Para llamar a este fichero, se escribe

UNIX% uudec.pl fichero.uu

y se crea el fichero codificado, que luego podrá 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.

En realidad, la orden unpack decodifica de formatos de codificación internos a cadenas; la orden pack hace exactamente lo contrario. La utilidad de todo esto se me escapa un poco, salvo que, por ejemplo, se quieran almacenar números reales de forma que pueda leerlos directamente un programa en C. En ese caso, se escribiría

print pack( "f", $zipi);

Un número real escrito así se podría leer directamente con la orden read del C (pero, ojo, no con la scanf, que sirve solamente para ficheros de texto). Otra forma de usarlo es para formatear ficheros de salida; usando

print
pack("A7",$cadena)

, 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 memoria-col.pl


1 #!/usr/bin/perl
until(0) {
3      print "Cliente, cantidad\n";
4      chop($_ = <>); 
5      last if !$_;
6      ($paganini, $cantidad) = split(/,/,$_);
7      $comision = $cantidad * 0.25;
8      ($seg, $min, $hora, $dia, $mes, $anho, @zape) = localtime(time);
9      $mes++;
10      $zipi = pack("A16",$paganini).pack("A7",$comision)."$hora:$min $dia/$mes\n";
11      push( @mem, $zipi );     
12 };
13 
14 print @mem;
Listado : Programa memoria-col.pl

Este programa, sobre el fichero siguiente

uno, 1605168
este es el dos, 166166
este puede ser el tres, 1616136

produciría la siguiente salida

uno             401292 19:54 25/7
este es el dos  41541.519:54 25/7
este puede ser e404034 19:54 25/7

(dependiendo, claro está, de cuando se hayan producido las susodichas transacciones cambiarán horas y fechas).

[ Preguntas frecuentemente preguntadas] [ Bibliografía.] [ Recursos Internet] [ Presentando lo impresentable] [ Todo bajo control]