|
|
|||||||||||||||||||||||||
|
IntroducciónEn este tutorial vamos a aprender a usar un útil módulo que se llama File::Find. Este tutorial fue creado para hacer búsquedas a través de los directorios de manera rápida y sencilla. Nos facilita el trabajo de gran manera, pues nos evita el trabajo de estar escribiendo grandes códigos para buscar a través de directorios y más si estos tienen muchos subdirectorios. Una de las grandes ventajas que tiene este módulo es que es multi-plataforma, esto significa que nos servirá tanto en Windows,UNIX,Mac o cualquier otro sistema operativo que estes utilizando. Las BasesBásicamente el sintáxis básica que vamos a usar con el módulo es:
use File::Find;
find(\&rutina, (@directorios|$directorio); Como vemos lo que hacemos es llamar una función que se llama find a la cual envíamos dos argumentos:
Un primer ejemploHagamos un ejemplo rápido y sencillo que nos va a permitir comprender más a fondo como funciona File::Find. Vamos a hacer un pequeño script que imprima los archivos que hay dentro de un arbol de directorios dado:
#!/usr/bin/perl
use strict; my $dir = 'C:/Perl/lib/'; find(\&imprimir_archivo, $dir); sub imprimir_archivo{ Veamos por partes. Primero llamamos la función find, a la cual como primer argumento enviamos una referencia a la subrutina que llamamos imprimir_archivo y como segundo argumento envíamos la variable $dir que contiene el directorio raíz que queremos buscar. Al ejecutar esto, File::Find hace una iteración a través de todos los archivos y directorios que encuentra en el directorio raíz, por cada elemento(sea directorio o archivo) llama a la función imprimir_archivo que le mandamos. En esta subrutina, hicimos algo sencillo, cada elemento es envíado por medio de la variable especial $_, la cual asignamos a una variable la cual llamamos $elemento. Después hacemos un print, que sólo va a ejecutar en el caso de que $elemento sea un archivo, que los hacemos con el -f de file que pusimos en el if. Sencillo ¿verdad?, con solo unas cuantas líneas de código, acabamos de hacer un boto que nos va a imprimir todos los archivos que hay en todos los directorios debajo de nuestro directorio raíz. Agregando más opcionesPues ya hicimos nuestro script que despliega los archivos, pero nos despliega el archivo y no tenemos idea en que subdirectorio esta. Para nuestra suerte, los creadores de File::Find pensaron en esto, así que cuando estamos en nuestra función, tenemos dos variables "especiales" que contienen información útil del archivo. Estas variables son:
Conociendo nuestras variables especiales, simplemente debemos de hacer unos pequeños cambios para que haga lo que nosotros queremos:
#!/usr/bin/perl
use strict; my $dir = 'C:/Perl/lib/'; find(\&imprimir_archivo, $dir); sub imprimir_archivo{ Vemos que sencillo es trabajar con este fabuloso módulo. Más Posibilidades
Lo hicimos con archivos, pero que tal si solo queremos desplegar los directorios. Para ese caso lo único que tenemos que hacer es cambiar la -f por una -d:
#!/usr/bin/perl
use strict; my $dir = 'C:/Perl/lib/'; find(\&imprimir_directorio, $dir); sub imprimir_directorio{
Digamos que por alguna razón queremos desplegar los archivos que tengan un tamaño menor a 1kb. Usando nuestro fabuloso módulo con unos cuantos cambios lo haríamos de manera muy sencilla:
#!/usr/bin/perl use strict; my $dir = 'C:/Perl/lib/'; find(\&imprimir_archivo_chico, $dir); sub imprimir_archivo_chico{
Ahora digamos que queremos desplegar los archivos que terminen con la extensión .pl, lo pensaríamos muy complicado, pero nada de eso:
#!/usr/bin/perl
use strict; my $dir = 'C:/Perl/lib/'; find(\&imprimir_archivo_pl, $dir); sub imprimir_archivo_pl{ if(-f $elemento && $elemento =~ /\.pl$/){ ConclusionesCuando tuve que usar este módulo por primera vez para un trabajo que tuve, no tarde más de 5 minutos en convenecerme de que era un módulo fabuloso y muy útil, además de que la sintáxis es sumamente sencilla. Como siempre les digo, jueguen un poco con el código para que comprendan más como funciona este módulo, usen su imaginación y jueguen...;-) Pueden ver la documentación completa de este módulo en:
|
||||||||||||||||||||||||
|
|||||||||||||||||||||||||