#!/usr/bin/env perl use strict; use warnings; use autodie; my %dir_tree; my $root_dir = '.'; build_dir_tree(\%dir_tree, $root_dir); sub build_dir_tree { my ($tree, $path) = @_; opendir(my $dh, $path); for (readdir $dh) { next if /^(?:\.|\.\.)$/; if (-d "$path/$_") { $tree->{$_} = {}; build_dir_tree($tree->{$_}, "$path/$_"); } else { $tree->{$_} = -s "$path/$_"; } } } { use Data::Dumper; local $Data::Dumper::Indent = 1; local $Data::Dumper::Sortkeys = 1; print Dumper \%dir_tree; }