use strict; use warnings; use Data::Dumper; my %table = ( 'key1' => [ '1', 'Z', '2', '3' ], 'key2' => [ '1', 'A', '2', '3' ], ); print Dumper(\%table); my @loop = map { { eenie => $_->[0], meenie => $_->[1], minie => $_->[2], mo => $_->[3] } } sort { $a->[1] cmp $b->[1] } map { [@{$table{$_}}[0..3]] } keys %table; print Dumper(\@loop); #### $VAR1 = { 'key2' => [ '1', 'A', '2', '3' ], 'key1' => [ '1', 'Z', '2', '3' ] }; $VAR1 = [ { 'mo' => '3', 'eenie' => '1', 'minie' => '2', 'meenie' => 'A' }, { 'mo' => '3', 'eenie' => '1', 'minie' => '2', 'meenie' => 'Z' } ];