# query setup omitted. # @keys is an array of your primary keys. The # first element of the array is the key used in # %tableData. Each following key is used to # identify a nested hash. my $last_key = pop @keys; my %tableData; while (my @data = $dbh -> dbnextrow) { my $row = { }; my $i = 0; foreach my $value (@data) { $value =~ s/^\s+//; $value =~ s/\s+$//; $row->{$columnames[$i++]} = $value; } my $nest = \%tableData; my $key_value; foreach my $key_name (@keys) { $key_value = delete $row->{$key_name}; $nest = ($nest->{$key_value}) ? ($nest->{$key_value}) : ($nest->{$key_value} = { }); } $key_value = delete $row->{$last_key}; $nest->{$key_value} = $row; } return \%tableData;