G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!

Script Python en una línea del mes, una sátira.
Por Mike Orr ("Sluggo")

Traducción al español por Alberto Rodriguez Galdo
el día 18 de Febrero 2004, para La Gaceta de Linux

 

"Woomert, Woomert!" Frink Ooblick entró en la habitación y cerró la puerta tras él. Estaba extasiado.

"¿Que ocurre, Frink?" dijo Woomert Foonly. "Parece que hubieses visto un fantasma"

"Hay un tipo fuera, Sluggo. Dice que va a patear mi trasero (ass) de Perl."

"¿Trasero?" Woomert quedó desconcertado. "Pero tú no tienes un burro."

"El quiere decir entrepierna," explicó Frink.

"Oh, entonces debe estar hablando de un camello. El trasero de un camello. ¿Que sabes de ese Sluggo?

"Es el que se ha trasladado al apartamento de la esquina. Es grande, calvo, y tiene una amenazante cazadora bomber. Tiene un tatuaje de una serpiente en el brazo. Y tiene un parche en la cazadora de un camello tachado."

"Un fanático de Python, ¿No?"

"Parece que si. Dice que puede batir nuestros códigos en linea de Perl"

"Bueno, ya le tenemos vencido" Dijo Woomert riéndose. Todo el mundo sabe que no hay otro código en línea de Python que no sea 'print "Hello, spam world!"'

"Quiere participar en tu concurso POLOTM. Y--" Frink se paró.

"¿Y qué Frink?

"Frink contestó despacio, "El... dijo que eres un sucio espia comunista."

"¡Eh, me ducho todos los dias!. Bueno, bueno, vamos a apuntarlo en el concurso." Musitó Woomert. "Dile que le daremos un ejemplo en Perl y que tendrá que volver con un ejemplo en Python al menos igual de elegante. Tendremos que buscar un juez. Seguramente no me aceptará a mi como juez imparcial" Pensó y pensó, y entonces golpéo con su puño en la mesa. "¡Ya sé! Elbert Arkleberry. Es conocido por ser imparcial sobre lenguajes de programación. Seguro que el lo hace. Pero tú, Frink..." Posó su mano en el hombro de Frink. "Tienes que explicar y defender tu mismo el ejemplo en Perl."

"¡Puff! dijo Frink. "¿Quieres que yo defienda el código en Perl con ese animal? Me cortará la cabeza."

"Creo que sera una buena experiencia de aprendizaje para ti. Recuerda que estabas preocupado cuando estabas negociando con aquella rubia cliente tuya, y no era para tanto. Por que no vas fuera ahora y le dices a ese Sluggo que venga mañana a las diez en la parte de atrás de Quick-E-Mart."

"Bueno, vale Woomert, si tu lo dices. ¿Pero... me dejas tus gafas de sol? Creo que con ellas me atreveré."

"Si Frinko." Estuvo buscando y encontró las gafas, que hacía tres años que no usaba. "Aqui las tienes."

Frink se puso las gafas y abandonó la habitación un poco mas audaz que cuando había entrado.

El gran día.

Aunque hacia sol, hacia frio en el pequeño círculo que habían conseguido detrás del Quick-E-Mart. Frink estaba sentado en el bordillo con su portátil encendido en las rodillas. Sluggo estaba sentado en la acera unas baldosas mas allá. No tenía portátil, pero el juez Arkleberry había traido un viejo 486 a 75 Mhz para que lo utilizase. El juez mismo, un ex-jugador de fútbol, se sentó entre las dos partes para impedir posibles disputas en la batalla. Woomert se colocó delante de ellos con una pila de papel impreso.

Sluggo miro a Frink y entornó los ojos de una forma repugnante. Frink tragó saliva e intentó volver a mirarlo fijamente. Woomer miraba a los dos y reía entre dientes. "Bueno, empecemos", dijo, y el concurso comenzó. Los dos miraron a Woomert. Les enseñó un papel impreso. "Aquí está el primero," dijo. En el papel impreso ponía:

PROGRAMA PERL:
  perl -wpe's/at/op/g'  INPUT

ARCHIVO DE ENTRADA:
  A cat sat on a mat with a hat.

SALIDA:
  A cop sop on a mop with a hop.

Woomert dijo, "Frink, explícaselo."

"La opción -w imprime un warning acerca de posibles construcciones en Perl que son errores comunes. La opción -p significa "ejecuta cada linea de entrada con la expresión e imprime el resultado". Actualmente lo que imprime es el valor de la variable por defecto $_, pero para un programa de una sola línea como este es esencialmente lo mismo. -e significa que proporcionas el programa en la linea de comandos. -s representa una sustitucion de acuerdo a una expresión regular. g (global) significa "sustituye todas las ocurrencias de la línea, no sólo la primera".

"Gracias Frink. ¿Sluggo?"

"Sluggo escribió durante un par de minutos es su portátil y nos enseñó esto:

% python -c \
> "import sys; print sys.stdin.read().replace('at', 'op')," <INPUT
A cop sop on a mop with a hop.

[Partimos la linea por que algunos navegadores e impresoras no muestran bien lineas largas. Sluggo escribió todo en una línea (sin la barra invertida)]

"¡Caray! dijo Woomert, "Pensaba que los import de Python hacían que cualquier código en una línea que no fuese trivial imposible. Me olvidaba que puedes poner dos comandos en una lína separados por un punto y coma. De acuerdo, explica tu programa, Sluggo."

"sys es el módulo que tiene diversos servicios de sistema. En este caso estamos usando sys.stdin, que es el manejador de la salida estándar. No necesitamos sys.stdout porque print es un método que devuelve todo el archivo como una cadena. Como ya es una cadena podemos usar el método de cadena .replace sobre ella, que sustituye todas las ocurrencias de 'at' por 'op'. La coma al final impide que print añada una nueva línea, de manera que el resultado sea el mas parecido al original. Python no tiene nada equivalente a la opción -w de Perl, pero no la necesita. La sintaxis es mas directa y estricta, de manera que la mayoría de construcciones que detectase -w son errores en Python."

Sluggo no mencionó que Python tiene warnings y una opción -W por que la mayoría de programadores de Python no la usan. Los warnings que lanza Python son pocos y son acerca de situaciones poco drásticas. -W se utilizará si el programa lanza sus propios warnings o si quieres abrumarte con características desconsejadas.

El juez miró el programa, y dijo después de un momento, "Colocar ese import en la misma linea esta bien; no podríamos tener concurso sin esto, por que Python tiene sus servicios básicos en librerías. .read es correcto aunque lee el archivo al completo en lugar de línea a línea. En este caso trivial no hay diferencia. Solamente significa que no querrás utilizar el código en un archivo de varios megabytes. Pero tenemos que rechazar .replace. Es una sustitución literal de una cadena y no tiene la flexibilidad de una expresión regular. Puedes hacer otro intento si quieres."

Sluggo frunció el ceño y ejecutó un editor. En un par de minutos nos mostró otro programa.

% cat program.py
import re, sys;  print re.sub(sys.argv[1], sys.argv[2], sys.stdin.read()),

% python program.py at op <INPUT
A cop sop on a mop with a hop.

"De acuerdo, explicanos este," dijo Woomert.

Sluggo nos explicó, "Es el mismo que el ejemplo anterior pero con una expresión regular. re.sub es una función que hace el equivalente Perl de s///g. Automáticamente reemplaza todas las ocurrencias de manera que no necesitas la opción g. sys.argv es una lista-- Quiero decir, un array-- de los argumentos de la linea de comando. sys.argv[0] es el propio nombre del programa, asi que lo obviamos. sys.stdin.read() convierte el archivo de entrada en una cadena, de la misma manera que el anterior.

"Pero la sintaxis de ejecución no es la misma," objetó Frink. "Aún si permitimos que el programa esté en un archivo en lugar de en la misma línea."

"Python no necesita la sintáxis s///g. Es mucho mas sencillo para el usuario si no tienen que manejarse con las barras invertidas, especialmente si estan embebiendo barras invertidas en algun lugar del código. Sé que se puede hacer s!!!g en Perl, pero tal y como yo lo hago es mucho mas conveniente."

El juez dijo. "Me gusta cómo el programa Python tiene una sintaxis de línea de comandos mas sencilla. Pero el programa es mucho mas largo que el equivalente Perl. Parece un nudo."

"El juez ha hablado," declaró Woomert. Mostró otro papel impreso.

perl -i wpe's/at/op/g'  *

"Frink te lo demonstrará."

Frink mostró como editaba varias lineas en su portátil . "Asi es como funciona la opción -i

"OK, Sluggo, es tu turno," dijo Woomert.

Sluggo se puso colorado y ni se movió. Woomer dijo, "Sluggo, ¿Pasa algo?"

Sluggo se sentó callado por un buen rato. Y al final confesó, "Ese es el único caso en el que usaría Perl"

Frink estaba pasmado. "¿Significa eso que das el concurso por perdido?

"Supongo que si." Sluggo miró a Frink durante un segundo y luego miró a otra parte.

El juez Arkleberry se aclaró la garganta. "Todavía podemos ver como lo harías en Python."

Sluggo recordó que había un módulo llamado fileinput, pero no era capaz de recordar la sintáxis. Así que se pasó algún tiempo consultando la referencia de las librerias de Python en el portátil del juez, y después escribió:

% cat program.py
import fileinput, re, sys
for lin in fileinput.input(sys.argv[3:], inplace=1):
    print re.sub(sys.argv[1], sys.argv[2], lin),

% cat INPUT
A cat sat on a mat with a hat.

% cat INPUT2
tit tat

% python program.py at op INPUT INPUT2

% cat INPUT
A cop sop on a mop with a hop.

% cat INPUT2
tit top

Sluggo añadió, "He intentado pensar en una manera de hacer ese ejemplo Perl en Python de una manera sensata, pero no he podido. Perl es una porquería, pero en ese caso merece la pena. Hay una cosa en la que me encuentro frustrado. Hay veces que quieres que te pregunte interactivamente cual encaja en la expresión para sustituir, tal y como hace el vim pero con multiples archivos. Vim te deja buscar y reemplazar en multiples archivos, pero tienes que hacer ':w :n, flecha arriba unas cuantas veces, enter' al final de cda archivo y esto se hace cansino. He pensado en hacer un programa que lo haga, pero no me he puesto todavía. Puede que en el concurso PyOLOTM del mes que viene, aunque ciertamente no será un programa en una línea, así que tendré que pensar un nuevo título para la columna."

El juez miró alrededor. "¿Lo ha demostrado el Sr. Bint?"

Sluggo susurró a Frink, "¿Quien es el Sr. Bint?"

Frink le susurró, "Es la persona que dice que C es el único lenguaje que merece la pena aprender, y espera que no publiquemos tantos artículos sobre Perl y Python por que distrae a la gente de aprender un lenguaje realmente útil en profundidad. Nadie le ha visto desde abril. Es un sin-hogar que vive en Inglaterra, y escribe todos sus artículos desde una biblioteca pública."

"¡Eso es impresionante!" dijo Sluggo. "La biblioteca solo te dá 45 minutos al día de Internet, y todo lo que te dejan es un navegador, el Word y el Excel. Puede llevarle eternamente escribir un artículo de esa manera. ¿Y como comprueba el programa?"

Sluggo cerró el portatil del juez y se levantó para irse, pero Woomert carraspeó. "Uh, Sluggo, hay una cosa que todavía tenemos que solucionar." Se puso las gafas de sol.

La mandíbula de Sluggo se tensó y fijó la vista en Woomert, preparado para hacer un movimiento rápido. "¿Que quieres, pequeñin?" preguntó buscando pelea.

"Me baño una vez al día," dijo Woomert, ignorando el cambio de nombre.

"De acuerdo, eres un espía comunista limpio."

"Uno sobre el que Thomas Adam, el Mecánico Linux de fin de semana, ha sugerido que debería pugnar por el puesto de Primer ministro británico," dijo Woomert.

"Se refiere a que debe escapar del cargo," explicó Frink a Sluggo.

Sluggo tendió su mano a Frink y dijo, "La mejor herramienta para el trabajo." Frink chocó su mano y repitió "La mejor herramienta para el trabajo." Sluggo le dió una palmadita en la espalda y dijo, "Eres buena gente aunque tengas un nombre idiota." Frink le replicó indignado, "Eh, no es tan malo como 'Woomert Foonly'."

Epílogo

Unas cuantas horas despues, Woomert estaba en la oficina cuano se abrió la puerta y Frink y Sluggo aparecieron charlando acaloradamente.

"Parece que has hecho un nuevo amigo, Frink," observó Woomert.

"Sluggo y yo vamos a patear algunos principiantes de Visual Basic," dijo Frink excitado, poniéndose las viejas botas de acero que le habia dado Sluggo (dos tallas mas grandes) y metiendo un pisapapeles en su bolsillo.

"Si, se donde están, bajo el puente a las afueras de la ciudad," explicó Sluggo.

"¿Pero que hay de aquello de la-mejor-herramienta-para-el-trabajo de esta mañana? ¿Lo has olvidado ya?

"Oh, estabamos hablando de lenguajes de programacion de verdad," dijo Frink, dando un portazo al salir con Sluggo.

"¡Pasadlo bien!" Les dijo Woomert con cierta agitación.

"Lo haremos," gritó Frink en la distancia.

 

pictureMike es el Editor-en-jefe de Linux Gazette. Puedes leer lo que tiene que decir en la pagina trasera en muchos números de Linux Gazette. Es un entusiasta de Linux desde 1991 y usuario de Debian desde 1995. Ha sido coordinador técnico de SSC entre 1999 y 2003, lo que significa que ha tenido que escribir montones de scripts en Python. Ahora está involucrado en tres proyectos de software libre basados en Python (Cheetah, Webware and YAML), escribe pruebas de unidad, programa para un sitio web de comercio electrónico y edita LG desde su casa. Esta interesado en wrestling, ska y oi!, musica ambiental y en el lenguaje internacional Esperanto. Se sabe que escucha a Dvorak, Schubert, Mendelssohn y a Khachaturian.



Copyright © 2003, Mike Orr ("Sluggo"). Licencia de copia http://linuxgazette.net/copying.html
Publicado en el número 96 de Linux Gazette, Noviembre de 2003