| Artículos | 01 JUL 2001

Programación en Perl (V)

Tags: Histórico
Javier Cáceres.
Un lenguaje de programación sería de escasa utilidad si no pudiera interactuar con el sistema sobre el que se ejecuta. Así pues, este mes lo dedicaremos principalmente a la integración de Perl con el sistema. Asimismo, contando con el conocimiento sobre las regex adquirida en la anterior entrega, comentaremos algunas funciones avanzadas que hacen uso intensivo de este recurso del lenguaje.

Estamos en condiciones de afirmar que, si aún no se ha dado cuenta de la extraordinaria importancia de las expresiones regulares en todo lo que es el mundo de Perl, de aquí en adelante albergará pocas dudas al respecto. Las regex son parte troncal de la estructura de Perl, y pieza clave e indispensable de multitud de sus funciones. Esta circunstancia nos llevó en su momento a mantenernos apartados de algunas de las funciones más potentes del lenguaje, puesto que, como es obvio, no podrían comentarse adecuadamente sin un cierto conocimiento de tales expresiones. Estas expresiones, como bien recordará, fueron cubiertas con suficiente profundidad en el pequeño monográfico del pasado mes. Así pues, aprovecharemos esta ocasión para exponer algunas de las funciones internas más versátiles del lenguaje, como son sort, grep, o map. Esto contrastará ligeramente con la tónica general del resto del artículo que, como verá, está dedicado a describir los medios que emplea Perl para comunicarse con el sistema operativo en el que se asienta. De esta forma, con suficiente atención se pueden distinguir dos grandes bloques en el texto que afrontaremos hoy: una primera sección dedicada a estas funciones avanzadas que acabamos de comentar, y una segunda parte enfocada a describir los posibles puentes o medios de comunicación con el sistema.

Sort, la clave de la ordenación
Si hasta este punto ha seguido el curso con cierta atención, es muy posible que se esté preguntando dónde están las funciones para ordenar, tanto alfanumérica, como numéricamente. Bien, como era de esperar, tenemos a nuestra disposición una excelente función estándar de Perl para realizar esta tarea. Estamos hablando de sort.
La función sort recibe por un lado un conjunto de elementos almacenados en un array, y devuelve, como su propio resultado, el mismo conjunto de datos, si bien en esta ocasión ordenados alfabéticamente. Observe el código fuente del Listado 1: encontrará el uso de sort en su formato más simple. Tenemos un array asociativo que enlaza códigos postales con personas, y queremos ordenar tales personas en función de su código postal. La clave de la ejecución del programa reside en la sentencia: foreach $temp (sort keys %cp_nombre). La clave keys selecciona del array asociativo %cp_nombre tan sólo las claves. Este conjunto de claves es pasado sin orden alguno a la función sort. Sort ordena tales números de forma creciente y los devuelve a la función desde la que es llamado, en este caso foreach, que va iterando en la lista de códigos postales que le ha facilitado sort, asignando reiteradamente cada uno de los valores a la variable $temp, para luego ejecutar el bloque inmediatamente posterior, que básicamente muestra por pantalla tal código postal y el nombre asociado a tal código postal, clave del array asociativo %cp_nombre.

Ordenación inversa
Modifique la línea de foreach de forma que, justo antes de sort, se incluya la palabra reverse (foreach $temp (reverse sort keys %cp_nombre)). ¿Qué ocurre? Sencillo, la función reverse recibe un array simple, los distintos códigos postales, que coloca en orden inverso. Así pues, este conjunto de datos, colocados en posición inversa a como los colocó originalmente sort, es el que recibe la sentencia foreach, de tal forma que el resultado es el opuesto, en cuanto a orden, a lo visto en el código anterior.
Cabe destacar que reverse es una función que no depende para nada de sort, es autónoma en todos los sentidos y nos puede servir para múltiples fines. Como pequeña muestra de ello, analice el contenido del Listado 2. Observe que hemos implementado la base del pequeño programa en forma de función, pues le puede ser de mucha utilidad el muchos otros casos. La función Invierte recibe cualquier cadena y devuelve la misma cadena, pero en orden inverso. El secreto de la función reside en otra función que aprovechamos para repasar: split. En esta ocasión, split toma la variable $texto, y la divide en tantos bloques independientes a almacenar en el array @cadena, como segmentos de texto haya entre uno y otro carácter de separación. El carácter de separación, una expresión regular, se indica entre barras (/ /). Como en este caso no hay nada dentro, básicamente split toma cada carácter de la variable $texto, y lo mete en posiciones consecutivas del array @cadena. Más tarde, reverse invierte tal cadena, almacenando el resultado en la variable $var, que es lo que es finalmente devuelve.

Ordenación numérica
Si la inquietud le ha llevado a probar distintas combinaciones con nuestro primer programa de hoy, se habrá percatado de que la ordenación numérica, en este caso, no es perfecta. Para sort, por ejemplo, 100 será siempre menor que 22, porque va comparando carácter a carácter como si de una cadena de texto se tratara y, por tanto, el 2 aparece como mayor que el 1, independientemente de lo que venga detrás. Afortunadamente hay una forma de comparar números y todo lo que precisemos comparar. Existe una forma de crear nuestras propias funciones de comprobación específicas. El esquema de este recurso lo puede encontrar en el Listado 3. Tenemos que definir una subrutina que ejecutará la función sort como criterio a seguir a la hora de ordenar dos elementos dados ($a y $b). La función criterio ha de ir en la condición de la instrucción if, y devolver 1 en caso de que se cumpla, -1 en caso de que no se cumpla y 0 en caso de que $a y $b sean equivalentes en la ordenación. Como última nota, destacar que han de emplearse forzosamente los nombres de variable $a y $b.

La función grep
En líneas generales, el uso de grep en Perl lo vamos a enfocar a algo muy específico. Si quiere buscar en una lista de datos (en un array), un determinado patrón (expresión regular), y generar inmediatamente otra lista (array) con aquellos datos de la lista original que se ajusten al patrón, entonces, grep es su función. Sería casi injusto decir que grep es una función sencilla de implementar pues, como casi todo en este lenguaje, puede llegar a complicarse increíblemente. No obstante, el ejemplo que le mostramos a continuación no es tan extenso como para justificar un listado por sí mismo. Pruebe a ejecutar las siguientes líneas de código en un programa cualquiera:
@direcc=qw(www.pcworld.com www.idg.es www.idg.com www.idc.com);
@res = grep /\.com/, @direcc;
¿Cuál es el contenido del array @res? Con un simple print puede comprobarlo (mejor use algo del estilo de print join “\t”, @res, “\n”;). En efecto, @res alberga sólo las direcciones de @direcc que terminan en “.com”. Pero podemos hacer más... Al mismo tiempo que buscamos patrones (ER), podemos realizar sustituciones en el array de búsqueda. Esta propiedad viene heredada directamente de la naturaleza de las expresiones regulares. Sustituya la lín

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información