最好的方法是扫描你的数据两次:首先确定列中的最大项目数和项目的最大宽度,然后实际显示数据。
这个程序演示
use strict;
use warnings;
my @AoA = (
["abc", "def", 1, 2, 3],
["blah", "blah2", 2],
["hello", "world", "how", "are", "you", "doing?"],
);
my $maxrow;
my $maxwidth;
for my $col (@AoA) {
my $rows = $#$col;
$maxrow = $rows unless $maxrow and $maxrow >= $rows;
for my $item (@$col) {
my $width = length $item;
$maxwidth = $width unless $maxwidth and $maxwidth >= $width;
}
}
for my $row (0 .. $maxrow) {
my $line = join ' ', map sprintf('%-*s', $maxwidth, $_->[$row] // ''), @AoA;
print $line, "\n";
}
输出
abc blah hello
def blah2 world
1 2 how
2 are
3 you
doing?
更新
提供修改后的输出要容易得多,因为无需计算最大字段宽度。
use strict;
use warnings;
my @AoA = (
["abc", "def", 1, 2, 3],
["blah", "blah2", 2],
["hello", "world", "how", "are", "you", "doing?"],
);
my $maxrow;
for my $col (@AoA) {
$maxrow = $#$col unless $maxrow and $maxrow >= $#$col;
}
for my $row (0 .. $maxrow) {
print join(' ', map $_->[$row] // 'null', @AoA), "\n";
}
输出
abc blah hello
def blah2 world
1 2 how
2 null are
3 null you
null null doing?