use strict; use warnings; use Data::Dumper; my $aoh = [ { a => 'yabba', b => 'dabba', c => 'do', }, { a => "what's", b => 'up', c => 'doc', }, { a => 'to', b => 'the', c => 'moon', d => 'alice!', }, ]; my @aoa = convert_aoh_aoa($aoh); print Dumper \@aoa; @aoa = convert_aoh_aoa($aoh,[qw/c b d/]); print Dumper \@aoa; sub convert_aoh_aoa { my $aoh = shift; my $col_names = shift || [sort keys %{$aoh->[0]}]; return ( $col_names, map { [@$_{@$col_names}] } @$aoh ); } __END__ $VAR1 = [ [ 'a', 'b', 'c' ], [ 'yabba', 'dabba', 'do' ], [ 'what\'s', 'up', 'doc' ], [ 'to', 'the', 'moon' ] ]; $VAR1 = [ [ 'c', 'b', 'd' ], [ 'do', 'dabba', undef ], [ 'doc', 'up', undef ], [ 'moon', 'the', 'alice!' ] ];