显示格式化表格

时间:2011-04-20 01:44:04

标签: perl

我正在尝试以表格格式显示输出,但遇到了一些麻烦。

我有一些变量包含以空格分隔的字符串,例如:

$var1 = "1 1003 33 40 9948";
$var2 = "2";

我希望桌子看起来像这样:

我想显示表格,如下所示:

Column1 Column2
======= =======
   1       2
 1003      
  33
  40
 9948

我希望var1的内容为每个值包装。

我能够显示标题没问题。我一直在尝试使用perl的格式:

^|||||~~^|||||~~^|||||~~^|||||~~^|||||~~

$var1    $var2   $var3   $var4  $var4  
.

......但效果不佳。

这个数字没有排列正确,我试图填充以便我强迫它们换行,但它们排列不均匀。该表的内容通过foreach循环显示:

Column1 Column2
======= =======
 1          2
1003
  33
40
9948

我希望我能清楚自己要做的事情!

1 个答案:

答案 0 :(得分:0)

一般来说,我没有发现Perl的模式非常可靠。它们对于一些事情非常有用,但通常需要比看起来更多的工作。

之前的答案显示了更标准的右对齐(对数字有意义),但您似乎想要一个居中的对齐。但是,我不明白您使用^|||||代替@|||||的原因。如果需要,前者将尝试在多行上包装文本;那不是你想要的。您应该使用@|||||代替。

此外,没有必要使用

^|||||~~^|||||~~^|||||~~^|||||~~^|||||~~

因为第一个~~将允许模式无限重复。

那就是说,我认为通过自己生成文本而不是依赖Perl的格式,你可以更好地控制这个过程。

sub centerText {
    my ($text, $width) = @_;
    my $pad = ( length($text) < $width )
        ? ' ' x int(($width - length($text)) / 2)
        : '';
    return "$pad$text";
}

然后你只需使用:

printf "%-7s %-7s\n", 'Column1', 'Column2';
printf "%-7s %-7s\n", '=======', '=======';
printf "%-7s %-7s\n", centerText($val1[1], 7), centerText($val2[1], 7);

或某些。

那有道理吗?