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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19