use POSIX qw(ceil); my $rows = ceil( scalar @a / $col ); for ( my $i = 0; $i < $rows; $i++ ) { printf( ("%-${max}s " x $col)."\n", map { defined $_ ? $_ : '' } @a[($i*$col)..(($i*$col)+($col-1))] ); } # transposed $rows = ceil (scalar @a / $col ); for ( my $i = 0; $i < $rows; $i++ ) { printf( ("%-${max}s " x $col)."\n", map { defined $_ ? $_ : '' } @a[ map { $i+($_*$rows) } (0..$col-1) ] ); }