Práctica: Iterador de Archivos

Construya un iterador dir_walk que recorra los arboles de directorios de sus argumentos generando un fichero de cada vez. Observe el modo de uso y el resultado de una ejecución:
lhp@nereida:~/Lperl/src/hop/Chap4$ cat -n dirwalk.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3
 4  sub dir_walk {
 .  ..............
19  }
20
21  my $d = dir_walk(@ARGV);
22
23  my $f;
24  while ($f = $d->()) {
25    print "$f\n";
26  }
lhp@nereida:~/Lperl/src/hop/Chap4$ ./dirwalk.pl /tmp/Parallel-Simple-Pipe-0.01
/tmp/Parallel-Simple-Pipe-0.01
/tmp/Parallel-Simple-Pipe-0.01/script
/tmp/Parallel-Simple-Pipe-0.01/t
/tmp/Parallel-Simple-Pipe-0.01/META.yml
/tmp/Parallel-Simple-Pipe-0.01/lib
/tmp/Parallel-Simple-Pipe-0.01/Changes
/tmp/Parallel-Simple-Pipe-0.01/MANIFEST
/tmp/Parallel-Simple-Pipe-0.01/Makefile.PL
/tmp/Parallel-Simple-Pipe-0.01/README
/tmp/Parallel-Simple-Pipe-0.01/script/test2.pl
/tmp/Parallel-Simple-Pipe-0.01/script/test.pl
/tmp/Parallel-Simple-Pipe-0.01/t/Parallel-Simple-Pipe.t
/tmp/Parallel-Simple-Pipe-0.01/lib/Parallel
/tmp/Parallel-Simple-Pipe-0.01/lib/Parallel/Simple
/tmp/Parallel-Simple-Pipe-0.01/lib/Parallel/Simple/Pipe.pm
/tmp/Parallel-Simple-Pipe-0.01/lib/Parallel/Simple/Communicator.pm
lhp@nereida:~/Lperl/src/hop/Chap4$
Nota: para que el operador -d funcione es necesario que los nombres de fichero especifiquen también el camino al archivo. No basta con el nombre de base. Sin embargo, lo que devuelve readdir es el nombre base.
lhp@nereida:~/Lperl/src$ perl -de 0
main::(-e:1):   0
  DB<1> opendir $d,'/tmp/Parallel-Simple-Pipe-0.01'
  DB<2> x scalar(readdir $d)
0  '.'
  DB<3> x scalar(readdir $d)
0  '..'
  DB<4> x scalar(readdir $d)
0  'script'
  DB<5> x scalar(readdir $d)
0  't'
  DB<6> x scalar(readdir $d)
0  'META.yml'
  DB<7> x -d 't'
0  undef
  DB<8> x -d '/tmp/Parallel-Simple-Pipe-0.01/t'
0  1

Como se ve en las líneas 2 y 3 de la sesión readdir retorna las referencias al directorio actual y al directorio padre. Tenga esto en cuenta apartando estos dos directorios para evitar la posibilidad de una recursión infinita.

Si lo considera necesario, repase las secciones sobre el manejo de directorios y ficheros 2.5, 2.9 y 2.10.

Casiano Rodríguez León
2009-10-04