2012-12-13 21 views
4

我想在列視圖中顯示數組內容。例如:我的數組包含如下值9:使用perl動態顯示列中的數組內容

@numbers = ("One","Two","Three","Four","Five","Six","Seven","Eight","Nine"); 

我想在2列中,如下顯示的值:

One  Two 
Three Four 
Five  Six 
Seven Eight 
Nine 

我可以使用表格和顯示如上所示,但我想辦對於一個非常大的數組動態使用循環同樣的事情。

任何人都可以幫助我這個。

謝謝

Avinesh

回答

10

使用拼接,你也可以修改列數:

use strict; 
use warnings; 

my @numbers = ("One","Two","Three","Four","Five","Six","Seven","Eight","Nine"); 
my $numcols = 2; 
while (@numbers) { 
    print join("\t", splice(@numbers,0, $numcols)), "\n"; 
} 
+0

非常感謝,這真的會幫助我。 –

+0

列在幾個地方是沒有道理的。我能做些什麼來正確對齊和證明列? –

+0

我的意思是像真棒的Linux命令'列' –

1

如果你想要的東西打印,而不是標籤,

push @data, '' if @data % 2 != 0; 

my $col1_width = 0; 
my $col2_width = 0; 
for (my $i=0; $i<@data;) { 
    $col1_width = length($data[$i]) if length($data[$i]) > $col1_width; ++$i; 
    $col2_width = length($data[$i]) if length($data[$i]) > $col2_width; ++$i; 
} 

my $format = "%-${col1_width}s %-${col2_width}s\n"; 
printf($format, splice(@data, 0, 2)) 
    while @data; 
+0

這看起來不錯,我可以在我的其他應用程序中使用它 –

3

一簡單的數學技巧也可以做到這一點。檢查數組索引是否可以被2整除。如果是,只要它不是第0個元素就打印一個換行符。

my @numbers = ("One","Two","Three","Four","Five","Six","Seven","Eight","Nine"); 

foreach my $i (0..$#numbers) { 
    print "\n" if ($i%2 == 0 and $i != 0); 
    print $numbers[$i] . "\t"; 
} 
+0

這真的很不錯。它可以幫助我在其他應用程序中。 –

0

您還可以使用地圖

map { print $numbers[$_] . (($_ + 1) % $numcols == 0 ? "\n" : "\t") } 0..$#numbers; 

或:

@numbers = map { $numbers[$_] . (($_ + 1) % $numcols == 0 ? "\n" : "\t") } 0..$#numbers; 
print @numbers; 
+0

這看起來對我來說很重要。我肯定會試試這個。非常感謝。 –

1

你應該利用的CPAN電源,使用該模塊Data::Tabulator。它正是你所需要的,「從列表(一維數組)」創建一個表格(二維數組)「。

+0

不錯的選擇,以後會用 – gaussblurinc