my $find = find('', ''); while (my $file = $find->()) { print join('/', @$file)."\n"; } sub find { my @todo = shift; my @results; return sub { while (@todo and not @results) { my $subdir = shift @todo; $subdir = "." if ! defined $subdir or $subdir eq ''; $subdir .= "/" if $subdir =~ m{[^/]$}; my @files= ( glob("$subdir.*"), glob("$subdir*") ); for my $file ( @files ) { next if $file =~ /\.\.?$/; if( ! -l $file && -d _ ) { push @todo, \ $file; } push @results, [ $subdir, substr($file,length($subdir)) ]; } } return shift @results; }; }