use Path::Class qw( dir ); sub visit { my ($dir, $level) = @_; $level ||= 0; my $group_indent = ' ' x (2*$level); ++$level; my $child_indent = ' ' x (2*$level); printf($group_indent."Group: %s {\n", $level ? $dir->basename : $dir); for my $file (dir($dir)->children()) { if ($file->is_dir) { visit($file, $level); } else { printf($child_indent."File: %s (%s)\n", $file->basename, $file); } } print($group_indent."}\n"); } visit('/proj/newdata');