{name => 'pm_multi_line_match.pl', size => 1025}, 'pm_multi_mod_distro_test' => { 'My-Example' => { {name => 'Build.PL', size => 651}, ...etc #### #!/usr/bin/env perl use strict; use warnings; use File::Find; use Data::Dumper; my $rootDir = '/tmp/somedir'; $Data::Dumper::Indent = 1; build_tree(my $tree, $rootDir); print Dumper($tree); sub build_tree { my $node = $_[0] = {}; my @s; find( sub { push @$node, (pop @s)->[1] while @s and $File::Find::dir ne $s[-1][0]; $node->{'name'} = $_ if -f; $node->{'size'} = -s if -f; # Here is where I am lost...How do I get this pushed into an array? return $node if -f; push @s, [ $File::Find::name, $node ]; $node = $node->{$_} = {}; }, $_[1]); $_[0]{$_[1]} = delete $_[0]{'.'}; }