my @subfields = qw( REQ POS LENGTH data FILTER ); my @sorted_keys = sort qw( field1 field2 ); my @mydata = ( [ 'Y', 34, 10, ' ' x 10, \&default_filter ], [ 'Y', 35, 10, ' ' x 10, \&default_filter ] ); my $type = 'that_type'; for my $k (@sorted_keys) { @{ $hash{$type}{$k} }{ @subfields } = @{ shift @mydata }; }