use strict; use warnings; use Data::Dumper; @populations = qw(mice cats dogs potatoes); my %hash = gener(@populations); sub gener { my @populations = @_; my %HoH; for (@populations) { my @chroma = (0...10); my @chromb = (0...10); my @ind = (0...10); $HoH{$_} = { individual => \@ind, chromasome1 => \@chroma, chromosome2 => \@chromb, }; } foreach my $population ( sort keys %HoH ) { foreach my $info ( sort keys %{ $HoH{$population} } ) { print "$population: $info = ", join(', ', @{$HoH{$population}{$info}}),"\n"; } } print Dumper(%HoH); return %HoH; # returned as list; to returna ref, use \%HoH }