Guest User

Untitled

a guest
Feb 24th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3. use utf8;
  4.  
  5. our $AUTHOR = "cpan:potatogim";
  6. our $VERSION = "0.1";
  7.  
  8. package My::Generator;
  9.  
  10. use Generator::Object;
  11.  
  12. our %tree = (
  13. 'dir1' => [ 'dira', 'dirb', 'dirc' ],
  14. 'dir1/dirc' => [ 'dird', 'dire', 'dirf' ],
  15. 'dir2' => [ 'dirg', 'dirh' ],
  16. 'dir2/dirg' => [ 'diri' ],
  17. );
  18.  
  19. sub scandir
  20. {
  21. my $self = shift;
  22. my %args = @_;
  23.  
  24. return generator
  25. {
  26. my $path = $args{path};
  27.  
  28. foreach my $entry (@{$tree{$path}})
  29. {
  30. $_->yield($entry);
  31. }
  32. };
  33. }
  34.  
  35. sub walk
  36. {
  37. my $self = shift;
  38. my %args = @_;
  39.  
  40. return generator
  41. {
  42. my $gen = $_;
  43. my $top = $args{top};
  44. my $topdown = $args{topdown};
  45. my $follow = $args{followlinks};
  46. my $onerror = $args{onerror};
  47.  
  48. my @dirs = ();
  49. my @nondirs = ();
  50.  
  51. my $direntry = $self->scandir(path => $top);
  52.  
  53. while (my $entry = $direntry->next)
  54. {
  55. push(@dirs, $entry);
  56. }
  57.  
  58. # printf "TOP : %s\n", $top;
  59. # printf "TOPDOWN : %s\n", $topdown;
  60. # printf "FOLLOW : %s\n", $follow;
  61. # printf "DIRS : %s\n", join(', ', @dirs);
  62.  
  63. if ($topdown)
  64. {
  65. $gen->yield($top, \@dirs, \@nondirs);
  66. }
  67.  
  68. foreach my $dir (@dirs)
  69. {
  70. my $new_top = join('/', $top, $dir);
  71.  
  72. my $c_gen = $self->walk(
  73. top => $new_top,
  74. topdown => $topdown,
  75. followlinks => $follow,
  76. onerror => $onerror);
  77.  
  78. while (my ($c_top, $c_dirs, $c_nondirs) = $c_gen->next)
  79. {
  80. $gen->yield($c_top, $c_dirs, $c_nondirs);
  81. }
  82. }
  83.  
  84. if (!$topdown)
  85. {
  86. $gen->yield($top, \@dirs, \@nondirs);
  87. }
  88. };
  89. }
  90.  
  91. sub new
  92. {
  93. bless {}, shift;
  94. }
  95.  
  96. package main;
  97.  
  98. my $obj = My::Generator->new();
  99.  
  100. print "NON-TOPDOWN\n";
  101.  
  102. my $gen = $obj->walk(top => 'dir1', topdown => 0, followlinks => 1, onerror => undef);
  103.  
  104. while (my ($top, $dirs, $nondirs) = $gen->next)
  105. {
  106. printf "\nTOP : %s\n", $top // 'undef';
  107. printf "DIRS : %s\n", defined($dirs) ? join(', ', @{$dirs}) : 'undef';
  108. }
  109.  
  110. print "TOPDOWN\n";
  111.  
  112. $gen = $obj->walk(top => 'dir1', topdown => 1, followlinks => 1, onerror => undef);
  113.  
  114. while (my ($top, $dirs, $nondirs) = $gen->next)
  115. {
  116. printf "\nTOP : %s\n", $top // 'undef';
  117. printf "DIRS : %s\n", defined($dirs) ? join(', ', @{$dirs}) : 'undef';
  118. }
Add Comment
Please, Sign In to add comment