&traverse("."); sub traverse { my $dir = shift; opendir(my $dh, $dir) or die("bad dir - $!"); foreach (readdir($dh)) { next if /^\./; print $_.$/; &traverse("$dir/$_") if -d "$dir/$_"; } }