%{$tableData{$hashkey}{$hashkey2}} = %tblData; #### $tableData{$hashkey}{$hashkey2} = \%tblData; #### my $hashkey2 = $tblData{$key2}; delete $tblData{$key2}; $tableData{$hashkey}{$hashkey2} = \%tblData; #### $tableData{$hashkey}{delete $tblData{$key2}} = \%tblData; #### my @key = grep defined, $key, $key2, $key3; my %tableData; my $store_row = eval join("", q( sub { my $row = shift; $tableData), map("{delete \$row->{'$_'}}", @key), q( = $row; })); while (my @data = $dbh -> dbnextrow) { s/^\s|\s$//g for @data; my %tblData; @tblData{@columnnames} = @data; $store_row(\%tblData); }