my %global_data; fill_recursively(\%global_data, 10); sub fill_recursively { my $data_href = shift; # hashref to modify my $count = shift; # what level are we push @{$data_href->{"key $_"}}, "level $count" for 1..$count; fill_recursively($data_href, $count - 1) if $count > 1; } use Data::Dumper; print Dumper(\%global_data);