2011-04-20 74 views
0

我试图以表格格式显示输出,但有一些麻烦。显示格式表

我有一个包含由空格例如分隔字符串几个变量:

$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 

我希望我清楚自己正在尝试做什么!

回答

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); 

或诸如此类。

这有什么意义?