use strict; my @keys; # just to preserve order my %data; local $_ = do { local $/; }; while ( /(v_\w) {\n([^}]*)\n}/g ) { push @keys, $1; $data{$1} = [ split /\n/, $2 ]; } my $row = 0; while (1) { my @v = map { $data{$_}[$row] } @keys; last unless grep defined($_), @v; printf "%-3s", $_ for @v; print "\n"; $row++; }