use strict; use warnings; use Template; my @rows = (   { foo => 1, bar => 1, baz => 1 },   { foo => 2, bar => 2, baz => 2 },   { foo => 3, bar => 3, baz => 3 },   { foo => 4, bar => 4, baz => 4 }, ); my @titles = sort keys %{$rows[0]}; my $t = Template->new(); $t->process(\*DATA, { rows => \@rows, titles => \@titles }); __END__     [%- FOREACH title = titles %]         [%- END %]     [%- FOREACH terms = rows %]        [%- FOREACH term = terms.keys.sort %]            [%- END %]     [%- END %]
[% title %]
[% terms.$term %]