use strict; use warnings; use Test::More tests => 1; my $data = [ {a => 1, b => 2}, {a => 3, b => 4}, {a => 5, b => 6} ]; my $want = { a => [1, 3, 5], b => [2, 4, 6] }; my %columns; for my $row (@$data) { for my $k (keys %$row) { $columns{$k} //= []; push @{$columns{$k}}, $row->{$k}; } } is_deeply \%columns, $want;