my $data = []; while( my ($name, $value) = each %{$query} ) { if( $name =~ m/(.*)\_(\d)/ ){ $data->{$2}->{$1} = $value; } }