2011-04-20 177 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); 

或諸如此類。

這有什麼意義?