sub recurse_me { my $dir = shift; opendir FOO, "$dir" or die "Couldn't open $dir: $!; while( readdir FOO ) { if ( -d $_ ) { push @dirs, $_; } else { # do something interesting } } closedir FOO; recurse_me( $_ ) for ( sort @dirs ); }