G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!
La línea de comando de Perl del mes: Suficientemente bueno para los asuntos gubernamentales
Por Ben Okopnik
Traducción al español por Javier Ballesteros
el día 14 de Marzo 2003, para La Gaceta de Linux

Cuando Woomert Foonly abrió la puerta en respuesta a una insistente llamada, se encontró a sí mismo enfrente de dos tipos del tamaño (y la forma) de un frigorífico, con oscuras gabardinas y con cara de sabuesos. Observó que ambos estaban embutidos en sus gabardinas debido sus años de entrenamiento en artes marciales y su afeitado, cuidado al detalle, le causaron una reacción instantánea.

- "Hola" - Ustedes son ,obviamente, del gobierno, y están aquí para ayudarme, aunque yo no les haya llamado. ¿Puedo ver sus identificaciones?... Ah. Esa agencia. Vamos adelante caballeros. Sientánse cómodos para quitarse esas expresiones tan serias junto con sus gabardinas, no las necesitarán. Discúlpenme mientras llamo a mis superiores, es solo para asegurarme que todo es correcto; Necesito estar seguro de sus identidades. Por favor tomen asiento."

Unos instantes después, colgó el teléfono.

- "Muy bien; todo parece correcto, ¿Cómo puedo ayudarles,o para ir directos al grano, ayudar a sus asociados, que tienen un problema de programación? Soy consciente de que la seguridad es muy estricta en estos tiempos, y que su organización prefiere las reuniones vis-a-vis, en un entorno seguro, asi que estoy intrigado de saber que les trae por aquí; Normalmente no juzgo a la gente por su aspecto, pero ustedes claramente no son programadores."

Los hombres se miraron mutuamente, se levantaron sin decir una palabra, y comenzaron un minucioso examen de seguridad de la sala de Woomert - y de Woomert mismo- Usando una gran variedad de aparentemente carísimas herramientas. Cuando terminaron unos minutos después, de nuevo se miraron uno al otro y asintieron al unísono. Después cada uno de ellos se alcanzó el interior de sus gabardinas y extrajo un diminuto programador cada uno , ambos de los cuales fueron colocados enfrente de Woomert. Repetieron el ritual de mirarse y asentir, después de lo cual cada uno de ellos se retiró a la esquina opuesta de la habitación, para esconderse como sobras alargadas.

Woomert parpadeó.

-"En fin, los requerimientos de seguridad deben ser conseguidos... no importa lo que haga falta. Tomen asiento, caballeros; haré algo de té"

Unos minutos después de las presentaciones y del té caliente- los nombres de los individuos resultaron ser Ceedee Tilde y Artie Effem- Se pusieron manos a la obra. Artie resultó ser el portavoz de la pareja.

- "Sr. Foonly, nuestro gran reto estos días es el procesamiento de imágenes. Como puede imaginar obtenemos una gran cantidad de datos de vigilancia...bien, las obtenemos de una forma estandarizada que contiene bastante información aparte de la imagen: la IP del sitio que la origina, un campo de comentario, posición, información,etc. El problema es que ambos estamos bastante familiarizados con el procesamiento de texto en Perl pero no tenemos idea de cómo llevar acabo la extracción de un conjunto de registros que no sean texto, de ahí el problema, cómo evitar leer 200MB de un fichero de imagen cuando todo lo que necesitamos es leer la información de la cabecera...Tenemos que admitir que estamos bastante atascados. Nuestro gurú interno de C++ intenta convencernos de que sólo se puede hacer en el lenguaje que el usa - dice que no le tomaría mas de una semana o así, pero hemos oido esa historia antes" . Después de un asentimiento entusiasta de Ceedee, prosiguió: "De cualquier modo, pensamos que deberíamos consultarle - Tiene que haber algo que usted pueda hacer."

Woomert asintió.

- "Lo hay. Aunque, una cosa: ya que no tratamos con la clasificación actual de datos o cualquier otra cosa que requiera separación. Doy por sentado que me traen una hoja de especificaciones cuidadosamente revisada, ¿es así? - Quiero que mi ayudante, Frink Ooblick, esté en la discusión. Todo esto es de hecho similar al tipo de trabajo que ha venido llevando a cabo últimamente, así que puede resultar útil para nosotros también."

Frink fue traido y depurado por la pareja, que Woomert había apodado Fuerte y Silencioso, a parte del "perl -d" [1] nada mas lo evidenciaba. Una vez finalizadas las presentaciones, se colocó en su silla favorita desde la cual podia ver la pantalla Woomert.

- "De acuerdo, echemos un vistazo a la hoja de especificaciones. Hmmmmm..la cabecera es de 1024 bytes; cuatro bytes que es la dirección IP, un campo de comentario de 40 bytes, latitud y longitud de la parte superior izquierda e inferior derecha, cada una de las cuatro medidas precedidas por un caracter que define la longitud... bien, eso será suficiente para un comienzo; debería ser capaz de extrapolar la solución con lo anterior"

"¿Qué opinas, Frink? ¿Alguna idea de como abordar esto?"

Frink estaba todavía sentado detrás en su silla, con los ojos abiertos pensando.

- Sí, creo. por lo menos a la primera parte.Ya que están intentando leer un fichero binario, "read" parece la respuesta correcta. Para la segunda.. bien "substr", quizás..."

- "Cerca, pero no lo suficiente. "read" es correcto: queremos obtener un campo de longitud fija del fichero. Sin embargo, "substr" no es particularmente bueno para cadenas que no sean texto- y menos aún cuando no sabemos la longitud del campo a lo largo del tiempo, como es el caso de las cuatro medidas de latitud y longitud. No obstante, tenemos un arma mucho mayor... hey,chicos, ¡calma!" en cuanto Fuerte y Silencioso saltaron de sus esquinas, añadió "¡es sólo en sentido figurado!"

"De todas formas", continuó, con un destello en sus ojos, que insinuó que el desliz anterior no había sido tan casual, "Tenemos una herramienta mejor que podemos usar para esto, algo que nos dá todo lo que necesitamos y más: ``unpack''. Intenten esto:


# Fragmento de código, sólo; el procesamiento real de recuperar los datos se deja como ejercicio... :) ... $A="file.img";open A or die "$A: $!";read A,$b,1024;@c=unpack "C4A40(A/A)4", $b ...
El instante de silencio se alargó, hasta que Ceedee carraspeó.

-"Ah..Sr Foonly... ¿qué rayos es eso?, puedo entender la sintáxis de la función ``open'', aunque resulta un poco obtusa.. ``read'' también parece razonable .. pero, ¿cuál es la sintáxis de ``unpack''?, parece tan extraño como un perro verde."

Woomert miró alrededor. Artie estaba asintiendo en acuerdo e incluso Frink miró levemente desconcertado. Sonrió y tomó otro sorbo de té.

- "No hay nada de lo que preocuparse, caballeros; es sólo una plantilla del ``unpack'', un patrón que le dice cómo manejar los datos. Ahora lo analizaré para ustedes. Primero, creo, extenderemos el programa de una línea a algo un poco más legible, tal vez con algunos comentarios añadidos."


$A = "file.img"; # Pone $A igual al nombre del fichero open A or die "$A: $!"; # Open usando la "nueva" sintáxis read A, $b, 1024; # Lee 1kB de 'A' a $b @c = unpack "C4A40(A/A)4", $b; # Unpack $b en @c mediante una plantilla
La nueva sintáxis de "open" (desde Perl 5.6.0) nos permite "combinar" el nombre del descriptor de fichero y el nombre del fichero mismo, tal y como hice en las primeras dos líneas; el nombre de la variable (sin el caracter '$') se usa como descriptor. Si echan un vistazo a ``perldoc -f pack'', esto contiene una largísima lista de especificaciones de plantillas, casi cualquier cosa que se quiera hacer con conversiones; se pueden convertir varios tipos de datos, hacia adelante, copiarlos y en general cualquier clase de combinaciones. Lo anterior era bastante simple, de hecho:

C4 Un valor unsigned "char" repetido 4 veces A40 Una cadena ASCII de 40 caracteres de longitud (A/A)4 Cadena ASCII precedida por argumento de "longitud" el cual es el mismo un caracter ASCII, repetido 4 veces.
La salida resultante se asigna a @c, el cual ahora contiene algo paracido a esto:

$a[0] El primer octeto de los cuatro de la IP $a[1] segundo " " " " " " " $a[2] tercero " " " " " " " $a[3] cuarto " " " " " " " $a[4] El campo de comentario $a[5] La latitud de la parte superior izquierda $a[6] " longitud " " " " $a[7] La latitud de la parte baja derecha $a[8] " longitud " " " " "
Evidentemente, puede extender este proceso a toda las disposición desus datos. ¿Qué opinan, caballeros, se ajusta a sus necesidades?

A continuación, los ahora entusiastas Artie y Ceedee, habían sido desprendidos de los gigantescos guardianes que llevaban dentro y el lugar era ahora tan espacioso como antes de su llegada, Woomert abrió una botella de coñac "Hennesy Paradise" y trajo un par de de pequeños pero fragantes puros, que eran unos Cohibas de calidad.

- "Bien, Flink - otro caso resuelto; esto es algo que siempre me hace sentir contento y animado. Y para tí, ¡devora esos libros, chico! - o por lo menos cuando hayamos acabado este asunto. "perldoc perlopentut", es una buena introducción de distintas maneras de abrir un fichero, duplicar un descriptor, etc-; "perldoc -f pack" y "perldoc -f unpack" esplican esas funciones en detalle. Cuando creas que lo has entendido, encuentra un formato de fichero binario bien documentado y escribe un analizador que extraiga los datos para examinarlos. Mañana, a esta hora, deberías lo suficientemente experto para manejar estas herramientas..."



[1] Perl viene con un potente debugger integrado; veáse "perldoc perldebtut" y "perldoc perldebug" para más información. Obsérvese, no obstante, que no es muy eficaz localizando transmisores ocultos y micrófonos...

 

Ben es editor colaborador para Linux Gazette y miembro de la brigada de respuestas.

picture Ben nació en Moscú, Rusia en 1962. Enseguida se interesó por la electricidad, a la edad de seis años--demostrándolo inmediatamente, al introducir un tenedor en un enchufe y provocando un incendio-- y ha estado haciendo extracciones en las profundidades de los pozos tecnológicos, desde entonces. Ha estado trabajando con computadoras desde los Tiempos Antiguos, cuando se tenía que construir soldando las partes en un circuito impreso y los programas tenían que caber dentro de 4k de memoria. Pagaría gustosamente a cualquier psicólogo que le pueda curar las pesadillas que todo ello le ha causado.

Las siguientes experiencias de Ben icluyen la creación de software en casi una docena de lenguajes, redes y mantenimiento de bases de datos durante la aproximación de un huracán, escritura de artículos de revistas desde revistas de navegación y barcos, hasta boletines técnicos. Habiendo completado recientemente un crucero de navegación de siete años por el Caribe y el Atlántico, el está actualmente atracado en Baltimore, MD, donde trabaja como instructor técnico para Sun Microsystems.

Ben ha estado trabajando con Linux desde 1997, y lo puede acreditar por su ausencia de interés en emprender una guerra nuclear en la parte del Pacífico Noroeste.


Copyright © 2003, Ben Okopnik. Licencia de copiado http://www.linuxgazette.com/copying.html
Publicado en el número 88 de Linux Gazette, Marzo 2003