foreach my $dir (sort { length($b) <=> length($a) } keys %hash) { next unless $dir =~ m{^(.*)/[^/]*$}; my $parent = $1; next unless exists $hash{$parent}; $hash{$parent}{dir} += $hash{$dir}{dir}; }