Perl y su poderío

Al igual que José, considero que el hilo de discusión Borrar línea X de un archivo es bastante interesante, este hilo fué discutido en la lista de correos técnica 1 del Grupo de Usuarios de Linux de Venezuela (VELUG), el problema planteado 2 consistía en eliminar un registro completo, en donde se pasara como argumento el primer campo (tal vez el identificador) de dicho registro.

Suponga que el fichero tiene la siguiente estructura:

:(123
	... # otros campos
)

:(234
	... # otros campos
)

:(456
	... # otros campos
)

Se dieron soluciones en lenguajes como Bash y C 3 y ciertas en Perl, éstas últimas son las que llaman mi atención, vamos por partes 4.

José propuso lo siguiente:

#!/usr/bin/perl -n
$deadCount = 7 if ($_ =~ /${ARGV[0]}/);
--$deadCount if ($deadCount);
print unless ($deadCount);

El programa debe ejecutarse así:

$ perl script.pl archivo 123

Este programa hace el trabajo, pero al final emitirá un error porque cree que el argumento 123 es otro fichero, y por supuesto, no lo encuenta.

Mi solución fue la siguiente:

perl -ne 'print unless /:\\(123/../\\)/' input.data > output.data

Por supuesto, en este caso solamente estaría eliminando el registro cuyo primer elemento es 123, funciona, pero genera un problema al igual que el hecho por José, se deja una línea de espacio vacía adicional en los registros, cuando el separador de los grupos de datos debe ser una 5 línea en blanco, tal cual como apunto Ernesto Hernández en una de sus respuestas.

Otro apunte realizado por el profesor Ernesto, fué que las soluciones presentadas hasta el momento de su intervención fué el análisis de fondo que estabamos haciendo, el problema no consistía en procesar cada una de las líneas, el trabajo en realidad consistía en analizar un registro multilínea (o párrafo), en términos más sencillos, cada grupo de datos (registros) está separado por una línea en blanco.

El profesor continuaba su excelente explicación diciendo que el problema se reduce al analizarlo de esta manera en lo siguiente:

…si se cuenta con un lenguaje de programación que está preparado para manejar el concepto de “registro” y puede definir el separador de registro como una línea en blanco, simplemente se trata de ignorar aquellos registros que tengan la expresión regular (X, donde X es la secuencia de dígitos que no nos interesa preservar.

La solución presentada por el profesor Ernesto fue:

perl -000 -i -ne 'print unless /\\(XXX/' archivo

En donde se debe sustituir las XXX por los dígitos cuyo bloque no nos interesa conservar.

De este hilo aprendí cosas nuevas de Perl, en realidad estoy comenzando, muchos pensarán que este código es críptico, por ello considero conveniente aclarar algunas cosas.

Lo críptico de un código no es inherente a un lenguaje particular, eso depende más del cómo se programe.

En este caso particular una sola línea de código nos proporciona mucha información, evidentemente para comprender dicho contenido es necesario leer previamente cierta documentación del lenguaje, pero ¿quien comienza a programar en un lenguaje en particular sin haber leído primero la documentación?, la respuesta parece lógica, ¿cierto?.

La existencia de opciones predefinidas y maneras de ejecutar el interprete de Perl permiten enfocarse únicamente en la resolucion de tareas, cero burocracia.

Un ejemplo de lo mencionado en el párrafo anterior es el siguiente, un bucle lo puedo reducir con la opción de ejecución -n del interprete Perl, simplemente leyendo un poco perlrun6 nos enteramos del asunto, eso quiere decir que podemos reducir a una simple opción de ejecución del interprete de Perl todo esto:

#!/usr/bin/perl
while(<>){
#...
}

¿Qué es ese operador que parece un “platillo volador” 7 (null filehandle)?, bueno, lea perlop, en especial la sección I/O Operators.

La opción -i me permite editar (reescribir) in situ el fichero que vamos a procesar, en el caso de no añadir una extensión no se realizara un respaldo del fichero, el fichero original se sobreescribe. Mayor detalle en perlrun.

Lo que si no sabía hasta ahora, es lo explicado por el profesor acerca de los párrafos (registros multilínea) en Unix, la opción -0 tiene un valor especial, el cual es 00, si este valor es suministrado hace que Perl entre en “modo párrafo”, en pocas palabras, se reconoce una línea en blanco como el separador de los registros.

El resto del código es solo manejo de una sencilla expresión regular, se asume que el lector conoce algo del tema, solo indica el registro que queremos ignorar.

Así que podemos concluir lo siguiente, Perl no es críptico, asumiendo que el programador ha leido suficiente documentación acerca del lenguaje en cuestión, evitamos la burocracia y atendemos el problema de raíz en el menor tiempo posible.

La solución que propone Perl con el lema Hay más de una manera de hacerlo, es ofrecerle al programador libertad en su forma de expresarse, ¿acaso todos hablamos el mismo idioma?, ¿acaso debemos seguir las malas prácticas que intenta difundir el maligno Java?, coartar el pensar del programador y obligarlo a hacer las cosas al estilo Java, ¿dónde queda la imaginación? 8, ¿paso a ser un lujo?.

A todos los que lo deseen, les invito a participar en la lista de correos técnica (l-linux) del Grupo de Usuarios de Linux de Venezuela (VELUG), les recomiendo leer detenidamente las normas de uso antes de inscribirse en la lista.

  1. l-linux es la la lista de correos para Consultas Técnicas sobre Linux y Software Libre en VELUG[regresar]
  2. Quien inicio el hilo de discusión fue José Luis Bazo Villasante[regresar]
  3. ¿Con intención de autoflagelación?[regresar]
  4. Diría Jack El Destripador[regresar]
  5. No dos, ni tres, …[regresar]
  6. man perlrun, perlrun se incluye en la documentación de Perl, en sistemas Debian lo encontramos en el paquete perl-doc, para instalar simplemente hacer ejecutar el comando aptitude install perl-doc como superusuario[regresar]
  7. Según nos conto José Luis Rey, el profesor Ernesto Hernández le llama así de manera informal[regresar]
  8. De hecho, se dice que, un programador experto en Java está muy cerca de convertirse en un autómata[regresar]

2 Responses to “Perl y su poderío”


  1. 1 fpalm

    Qué tal Milton, cuanto tiempo?

    La cuestión no es que Perl sea críptico o no, o que no se pueda llegar a entender una línea de código.

    Yo he estudiado matemáticas más o menos serias, y alguna vez pensé, “hacen falta mucho años de estudio para entender -esta- página”. Y pienso también, “los años que he pasado para entender esto otros los han usado para acumular dinero y poder, y para lograr que a nadie le importe que yo entienda esta página”. Si buscan a un especialista del tema de seguro lo buscaran fuera del país, se buscarán al autor del libro.

    Si uno se vuelve tecnocrata siempre va a caer en ese problema. Los tecnocratas se convierten en simples peones de intereses económicos.

    Voviendo al tema. Poderoso, pensando en un lenguaje de programación, es que “tiene poder de hacer cosas”, en ningún lado está definido poderoso como “poder de hacerlo en pocas líneas”.

    La cuestión Milton, no es pensar lo que le parezca a UNA persona (si es críptico o no), sino que pasa cuando en el problema se involucran MUCHAS personas. El problema de los registros es bobo y no está bien definido, cuantos registros se van a manejar? muchos o pocos?. con que frecuencia se modifican los regitros?. Si son pocos registros haría un bucle simple, Si son muchos registros que se modfican poco haría una tabla hash para realizar búsquedas directas, Si son pocos registros que se modifican mucho tendría los registros indizados, más o menos como hacen los manejadores de bases de datos.

    El problema de hacer un script es que para los tecnocratas se vuelve en un objetivo en si mismo. Con estilo o sin estilo, con eficiencia o sin eficiencia, el tema es resolver el problema. De tu solución a la de Ernesto no veo ninguna diferencia signiicativa. En Python puedes hacer lo mismo, solamente que todo queda explícito, eso es malo para “pantallear” pero bueno para que otra persona lo vea y aprenda.

  2. 2 tabo

    Para agregar algo al excelente comentario de fpalm:

    En Python puedes hacer lo mismo, solamente que todo queda explícito, eso es malo para “pantallear” pero bueno para que otra persona lo vea y aprenda.

    La principal ventaja es además que en un código elegante y no críptico, otras personas van a poder trabajar en el mismo y poder mejorarlo. Esto es primordial en entornos de desarrollo en donde tiene prioridad el que el código pueda ser mantenido a que los programadores se “luzcan” con complejidades innecesarias (que para eso esta la IOCCC).

    Algunos dicen por ahí que Perl es Write-Only-Code, o código de solo escritura, porque una vez que se escribe nadie mas lo va a entender, en muchos casos ni el mismo autor luego de un tiempo. Si bien esta acusación es bastante injusta ya que en Perl se puede programar de manera ordenada y legible, hay un sector bastante grande de la comunidad de Perl que valora mucho el código críptico, minimalista y los “one-liners”.

Comments are currently closed.