my $tb = Tree::Builder->new(); find(sub { my $name = $File::Find::name; $name =~ s/^$dir//; $tb->add($name); }, $dir); my $tree = { $tb->getTree }; _transformTree( $tree ); ... sub _transformTree { my $ref = shift; ## I need sort of meta-data-enabled tree: foreach my $item (keys %$ref){ if( keys %{ $ref->{ $item } } ){ my $clone = $ref->{ $item }; $ref->{ $item } = {}; $ref->{ $item }->{name} = $item; $ref->{ $item }->{value} = $clone; # $clone = undef; # should I uncomment this? or does perl take care of it? _transformTree( $ref->{ $item }->{value} ); }else{ $ref->{ $item }->{name} = $item; $ref->{ $item }->{value} = undef; } } }