use strict; use warnings; use Data::Dumper; my $data = _test(); my $header_row; push @$header_row, [ "City Name", "Last Name", "First Name", "Addrress", ], [ "", "", "", "", ]; my @values = qw(CITY LAST_NAME FIRST_NAME ADDRESS); push @{$header_row} => [ map { @{$_}{@values} } map { @{$_} } @{$data} ]; print Dumper $header_row; sub _test { my @data = [ { 'CITY' => 'San Frans', 'LAST_NAME' => 'Doe', 'FIRST_NAME' => 'Jonh', 'ADDRESS' => '100 Main Street', }, ]; return \@data; }