El módulo File::Find
provee la función find
.
La sintáxis es:
find(\&wanted, @directories);
find()
hace un recorrido primero profundo
de los directorios especificados en @directories
.
Para cada fichero o directorio encontrado
se llama a la subrutina &wanted
.
Además, para cada directorio que se encuentre se cambia
chdir()
al directorio y se continúa la búsqueda,
invocando a la función &wanted
.
La función wanted
es lo que se denomina un callback (Callback_(computer_science).
En ella el programador escribe lo que quiere hacer con el fichero o directorio: imprimirlo, renombrarlo, borrarlo, etc.
La función será llamada sin argumentos y su valor de retorno será ignorado.
Cuando se la llama:
$File::Find::dir
es el directorio actual
$_
contiene el nombre del fichero actual
$File::Find::name
es el nombre completo del fichero
Estas variables son automáticamente localizadas por find
.
Veamos un ejemplo de uso:
lhp@europa:~/Lperl/src/perltesting/structinline$ perl -wde 0 main::(-e:1): 0 DB<1> !!tree -sD '.' . |-- [ 4096 Feb 13 8:18] _Inline | |-- [ 4096 Feb 13 8:18] build | |-- [ 390 Feb 13 8:18] config | `-- [ 4096 Feb 13 8:18] lib | `-- [ 4096 Feb 13 8:18] auto | `-- [ 4096 Feb 13 8:18] example_pl_7eb7 | |-- [ 0 Feb 13 8:18] example_pl_7eb7.bs | |-- [ 584 Feb 13 8:18] example_pl_7eb7.inl | `-- [ 30969 Feb 13 8:18] example_pl_7eb7.so |-- [ 778 Feb 13 8:18] all.t |-- [ 758 Feb 13 8:18] anon.t `-- [ 750 Feb 13 8:18] example.pl 5 directories, 7 files DB<2> use File::Find DB<3> sub callback { return unless -f $_; push @large, $File::Find::name if -s $_ > 30000 } DB<4> find(\&callback, '.') DB<5> x @large 0 './_Inline/lib/auto/example_pl_7eb7/example_pl_7eb7.so' 1 './_Inline/lib/auto/example_pl_7eb7/.svn/text-base/example_pl_7eb7.so.svn-base'El ejemplo encuentra un fichero adicional al mostrado por
tree
que se encuentra en un directorio escondido (.svn
).
Casiano Rodríguez León