use strict; use warnings; my ($i, @arr, $separator, @lengths, $length, $format); @arr = ( ['', qw/COL1 COL2 COL3 COL4/], [qw/COL1 once upon a time/], [qw/COL2 there was a little/], [qw/COL3 table of data/] ); $separator = ' | '; for (@arr) { for $i (0..$#$_) { $lengths[$i] = length($_->[$i]) if !$lengths[$i] || $lengths[$i] < length($_->[$i]); } } $length = 0; $length += $_ for @lengths; $length += length($separator) * $#lengths + 4; $format = join $separator, map { '%-'.$_.'s' } @lengths; print '-' x $length, "\n"; print '| ', sprintf($format, @$_), ' |', "\n", '-' x $length, "\n" for @arr;