G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!
La linea de Perl del mes: La Aventura de los Archivos Arbitrarios
Por Ben Okopnik
Traducción al español por Jorge Eduardo Ibarra Esquer
el día 24 de Marzo 2003, para La Gaceta de Linux

La primavera estaba en su pleno apogeo, y Woomert Foonly se encontraba distrutando de otro día perfecto.. Había llevado a cabo una sencilla y trivial configuración de un cluster Linux de 1,000 nodos y había llegado a la cumbre al comerse un b'stila marroquí con un ligero toque de curry ras el hanout y un couscous de fruta como complemento, y como postre arroz dulce con canela. Todo estaba en calma... hasta que Frink Ooblick apareció, ayudando -casi cargando- a un hombre que aparentaba estar en el límite del shock. Frink le ayudó a llegar al sofá y se dejó caer en el sillón, notoriamente agotado por el esfuerzo.

 -- "Woomert, esto es simplemente escandaloso. Este es Resolv Punto Conf, un humilde... mmm, bueno, un sysadmin, de cualquier modo. Recientemente, el fue cruelmente forzado a instalar algun tipo de SO legado em la computadora de su administrador - ¿lo puedes imaginar? - y ahora, se le pide que haga algo que parece casi imposible, aunque solo pude obtener detalles escasos. El ha escuchado de tu reputación (¿y quién no lo ha hecho?), y vino a ver si podías ayudarlo, pero se colapsó en la calle justo afuera de tu puerta, debido al shock residual y a una deficiencia severa de Jolt Cola. Ese es el problema... bueno, dejaré que el te lo diga".

Woomert había estado atendiento a su huésped mientras escuchaba, con el resultado que éste último ya se veía casi normal. De hecho, el "café grado sysadmin" de Woomert era bien conocido entre los cognoscenti por sus poderes restauradores, aunque la receta exacta permanecía en un profundo secreto (en algún momento, se pensó que contenía Espresso Alexander y nieve de café, pero las distintas teorías divergían ampliamente después de ese punto).

Sin embargo, en ese momento, los ojos del famoso detective tenían esa Mirada de concentración tan habitual al momento de trabajar.

 -- "Por favor digame su problema clara y concisamente."

El sysadmin, aún recuperándose, sacudió su cabeza con tristeza.

 -- "Mire, señor Foonly... lo que pasa es que yo tengo un script que procesa los datos que nos envían nuestras oficinas satelitales. Estos datos vienen en varias formas: somos un procesador de datos de aseguradoras, y el formato de cada compañía es diferente. Y no solo eso: algunos nos envían un archivo con los datos, otros utilizan 'gzip', 'compress', 'bzip', 'rar', o incluso 'tar' y 'compress' o 'gzip', y otros -afortunadamente los anteriores nos envían datos planos- mandan una trama de datos directo de sus aplicaciones propietarias. Nuestros programadores manejaron las diversas conversiones de formatos tan pronto como tuvieron las especificaciones, pero el problema de compresión arbitraria me fue encomendado a mi, y me trae vuelto loco!"

Se detuvo para tomar un respiro y otro trago del café de Woomert, el cual parecía revivirlo rápidamente, aunque aún permanecía encorvado, con su frente sobre su mano.

"De cualquier manera, en este momento, hacer que todo trabaje requiere intervención humana; tenemos a dos personas organizando y descomprimiendo los archivos durante todo el día. Si no fuera por eso, el sistema estaría completamente automatizado... y, por supuesto, la administración continúa insistiendo con: '¿por qué aún no se ha corregido? No se supone que ustedes son gente de computación que...' y así sucesivamente."

Cuando finalmente se levantó y miró a Woomert, su quijada se encontraba firme. Era un hombre claramente resignado a su destino, sin importar cuan horrible fuera.

"Sea honesto conmigo señor Foonly. ¿Es posible encontrar una solución o estoy acabado? Por supuesto que conozco el Mantra [1], pero me gustaría continuar si es posible; mis usuarios me necesitan y se de los Poderes Oscuros que amenazan con descender sobre sus almas inocentes si no tienen un sysadmin que los proteja."

Woomert asintió, reconociendo las palabras del cansado y viejo guerrero como completamente ciertas; también el se había encontrado y había combatido en contra de los Oscuros, criaturas que, si fueran liberadas incluso por un instante, sacarían de quicio a las mentes de los usuarios, y que sabían del valiente Gremio de los SysAdmins (http://sage.org), quienes habían jurado proteger a los inocentes (incluso de ellos mismos, vía la aplicación del místico y sagrado LART [2]).

 -- "Resolv, estoy muy feliz de decir que existe una solución al problema. Tengo la seguridad que has investigado acerca de las heramientas disponibles, y que has escuchado acerca de 'atool', un manejador de archivos de Oskar Liljeblad..."

Tras la aceptación de Resolv, el continuó.

"Muy bien; entonces también sabrás que maneja todos los formatos de archivo que mencionaste y varios más. A pesar de que está escrito en Perl, no vamos a utilizar nada de su código en tu script - lo cual sería una duplicación de esfuerzo. En vez de eso, simplemente vamos a utilizar 'acat', una de las utilerías de 'atool', como un filtro externo, un filtro condicional. Lo que tenemos que hacer es insertarlo al principio de tu script, de esta manera:



#!/usr/bin/perl -w # Creado por Resolv Punto Conf en Pungenday, Caos 43, 3166 YOLD @ARGV = map { /\.(gz|tgz|zip|bz2|rar|Z)$/ ? "acat $_ '*' 2>/dev/null|" : $_ } @ARGV; # Resto del script
...


"Perl se encargará de la magia adecuada, y eso solucionará el problema."

El sysadmin se levantó inmediatamente, apretando fervientemente la mano de Woomert.

 -- "Señor Foonly, no se como agradecerle. Ha salvado... bueno, no voy a hablar de eso, pero quiero que sepa que siempre tendrá un amigo dondequiera que yo esté. ¡Espere a que vean esto!... Oh, solo para ver si entendí, ¿qué es?, ¿cómo funciona?"

Woomert miró a Frink, quien también estaba al filo de su asiento, ansioso por escuchar la explicación.

 -- "¿Qué piensas Frink, crees poder manejar ésto? Solamente utilicé una función y un operador; el resto sucedió automágicamente, simplemente por la forma en que Perl trabaja con los archivos desde la línea de comando."

Frink se sonrojó un poco, y se chupó el pulgar como acostumbraba hacerlo cuanto estaba nervioso.

 -- "Bueno, Woomert... se que me dijiste que estudiara la función 'map', pero es demasiado extensa; me perdí muy rápido, y además estaban estrenando esa nueva película..."

Woomert sonrió y sacudió su cabeza.

 -- "Está bien. Entonces, 'map', según la información que entrega 'perldoc -f map', evalúa la expresión o bloque de expresiones que se especifica para cada elemento de una lista - organizada como un ciclo 'for', pero más corta y más conveniente en muchos casos. También utilicé el operador condicional ternario ('?:'), el cual funciona como una sentencia 'if-then-else':


# Operador condicional ternario - pone $a en 5 si $b es verdadera, o en 10 si no lo es $a = $b ? 5 : 10; # sentencia "if-then-else" - misma acción if ( $b ){ $a = 5; } else { $a = 10; }
"Las dos expresiones anteriores hacen lo mismo, pero el primer método es más corto y en ocasiones más conveniente. Al examinar el script paso por paso, lo que hice fue comparar cada uno de los elementos en @ARGV, el cual inicialmente contiene todo lo que sigue al nombre del script en la línea de comando, con la siguiente expresión regular:

/\.(gz|tgz|zip|bz2|rar|Z)$/

Esto encontrará cualquier archivo cuyo nombre termine en un punto seguido de cualquiera de las extensiones señaladas.

Ahora, si el nombre del archivo no concuerda con la expresión regular, el operador ternario regresa la parte después de los dos puntos, '$_', que simplemente contiene el nombre original del archivo. Entonces, Perl procesa el nombre del archivo como lo hace normalmente con los contenidos en @ARGV: abre un manejador para ese archivo y hace que su contenido esté disponible para el script. De hecho, hay varias manera de acceder a los datos una vez que eso se ha hecho; puedes leer acerca del operador diamante (<>), el manejador de archivos STDIN, y el manejador de archivos ARGV (¡mira el parecido y la diferencia, Frink!) para más información sobre algunos de los métodos de leer y escribir en archivos con Perl."

"Por otro lado, si el elemento actual contiene una de las extensiones indicadas, el operador ternario regresará el código que está antes de los dos puntos, en este caso

"acat $_ '*' 2>/dev/null|"

Perl ejecutará el commando anterior para el archivo actual. La sintaxis podría parecer un poco antigua, pero es lo que 'acat' (o, para ser más precisos, las utilerías de archivos que utiliza) requiere para procesar los archivos e ignorar los mensajes de error. Ve que el comando termina con '|', el símbolo 'pipe'; lo que pasa aquí es muy parecido a hacer un 'pipe' desde el shell. Entonces se ejecutará el comando, la salida se pondrá en un buffer de memoria, y los contenidos de ese buffer estarán disponibles en el manejador de archivo que Perl haya abierto para elarchivo - ¡presto, magia pura! [3]"

"También, para ponerlo de una forma más extensa, esto es lo que hice:


@ARGV = map { # Usar la sintaxis BLOCK de 'map' if ( /\.(gz|tgz|zip|bz2|rar|Z)$/ ){ # Comparar las extensiones de los archivos "acat $_ '*' 2>/dev/null|"; # Descomprimir/ sacar el contenido } else { $_; # De otro modo, regresar el nombre original } } @ARGV; # Esta es la lista para verificar
"Perl maneja todo a partir de ese momento. Una vez que se le haya pasado algo útil desde la línea de comando o la entrada estándar, él sabe que hacer. De hecho," dirigió una fuerte mirada a Frink, quien una vez más se veía avergonzado, "estudiar 'perldoc perlopentut' es algo que recomiendo para cualquiera que quiera entender la forma en la que Perl maneja el I/O. Esto incluye archivos, 'pipes', procesos hijos, filtros, archivos binarios, duplicación de manejadores de archivo, la versión de 'open' de un solo argumento, y muchas otras cosas. De algún modo, este podría considerarse como el documento más importante que acompaña a Perl. Dando una mirada a 'perldoc perlipc' podría también ser una buena idea - trata con varios aspectos relacionados, incluyendo apertura segura (de bajos privilegios) para procesos posiblemente inseguros, algo que puede resultar importante si se tiene un apuro."

 -- "Ahora, Resolv, creo que tienes un nuevo futuro brillante frente a ti; tu problema se solucionará, tu administración estará complacida, y tus usuarios estarán protegidos de los Inaceptables. Si quieres nos puedes acompañar en una pequeña celebración, acabo de terminar de cocer un 'Spotted Dog' y, oh. ¿A dónde se fue?... Es un budín inglés con grosellas muy fino. Bueno, supongo que quiere implementar ese cambio tan pronto como sea posible..."


Notas

[1] "Down, Not Across". Para aquellos que necesiten pistas adicionales acerca del sombrío significado del Mantra de los Sysadmin, busquen en los archivos de alt.sysadmin.recovery en <http://groups.google.com>, y todo se aclarará. Si ésto no sucede, entonces no estabas destinado a saberlo. :)

[2] Del archivo Jargon:

   Luser Attitude Readjustment Tool (Herramienta para reajustar la actitud del
   perdedor). ...  El LART clásico es una tabla de 2x4 o  cualquier otra tabla
   grande de madera que puede utilizarse  como garrote para aplicarse sobre la
   cabeza de los spammers o cualquier otra persona que cause a un sysadmin más
   dolor que el que viene  naturalmente con el trabajo.  Se han llevado a cabo
   largos debates en alt.sysadmin.recovery acerca de lo que constituye un LART
   plenamente  efectivo; tanto armas  semiautomáticas, lanzallamas como bombas
   tácticas tienen sus partidarios.


[3] Vea "perldoc perlopentut" para un tutorial acerca de la aperture de archivos, la 'magia' en @ARGV, e incluso "Deshaciendo el hechizo" ("Dispelling the Dweomer"), para esos que ya han visto demasiada magia. :)

 

Ben es un Editor Colaborador para la Gaceta de Linux y un miembro de la Pandilla de las Respuestas.

picture Ben nació en Moscú, Rusia en 1962. Se interesó en la electricidad a los seis años - demostrándolo rápidamente al introducir un tenedor en un contacto e iniciando un incendio - y desde entonces ha ido cayendo en pozos tecnológicos. El ha trabajado con computadoras desde los viejos tiempos, cuando debían construirse soldando partes en un circuito impreso y los programas debían caber en 4k de memoria. El estaría feliz de pagarle a un psicólogo que lo pueda curar de las pesadillas derivadas de eso.

Las experiencias subsecuentes de Ben, incluyen la creación de software en cerca de una docena de lenguajes, mantenimiento de redes y bases de datos mientras se aproximaba un huracán, y la escritura de arrículos para distintos tipos de revistas tecnológicas. Habiendo recientemente terminado un crucero de siete años por el Atlántico y el Caribe, se encuentra anclado en Baltimore, MD, donde trabaja como instructor técnico para Sun Microsystems.

Ben ha trabajado con Linux desde 1997, ésto debido a su completa pérdida de interés en iniciar una Guerra nuclear en algunas partes del noroeste del Paífico.


Copyright © 2003, Ben Okopnik. Licencia de Copia http://www.linuxgazette.com/copying.html
Publicado en la Edición 87 de la Gaceta de Linux, Febrero 2003