2017-04-12 47 views
0

有沒有辦法將數組的散列打印到文件中,使用散列的鍵作爲標題,並將數組的值作爲製表符(或其他)分隔的列進行打印?將列陣的散列作爲柱面打印到文件

我的最後一次嘗試是這樣的:

foreach my $key(sort keys %outHash){ 

    my $temp1 = join ("\n",@{$outHash{$key}}); 

    my $temp2 = $key."\n".$temp1; 

    print OUTPUT "$temp2\t"; 
    print OUTPUT "\n"; 

} 

將會產生太可怕輸出。 任何幫助將不勝感激! 謝謝。

+0

我們需要一些關於您的源數據的更多信息來回答。 – Sobrique

回答

1

如果我理解正確的話 - 你有一個數組哈希表,要在列打印。

爲了做到這一點:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my %test = (
    a => [ 1, 2, 3 ], 
    b => [ 4, 5, 6, 7 ], 
); 

my @header = sort keys %test; 

print join (",", @header), "\n"; 
while (map {@$_} values %test) { 
    my @row; 
    push(@row, shift @{ $test{$_} } // '') for @header; 
    print join (",", @row), "\n"; 
} 

但你可能有不同的數據結構更好,這是得到了你的數據使用散列切片,而不是按行組織逐行,和迭代行。

+0

非常感謝你們!兩種方法都很完美。我實際上想過組織數據的方式不同,但主要問題是我需要將數組和散列組合起來是解決此問題的最佳方法。我想將HoA轉變成2D矩陣,但想要在perl中轉置它的想法讓我有點害怕(相當新)。 – chrys

1

你可以試試這個:

use feature qw(say); 
use strict; 
use warnings; 

my %out_hash = (
    a => [1,2,3], 
    b => [3,4,5], 
); 

my @keys = sort keys %out_hash; 
say join "\t", @keys; 
my $N = 3; 
for my $i (0 .. ($N-1)) { 
    my @row; 
    for my $key (@keys) { 
     push @row, $out_hash{$key}->[$i]; 
    } 
    say join "\t", @row; 
} 

輸出

a b 
1 3 
2 4 
3 5 
+1

...它幾乎令人毛骨悚然,代碼是多麼相似,到了我們都單獨挑選了類似示例數據的地步...... – Sobrique

+0

是的......有時候會發生這種情況:)您提供了一個更通用的解決方案,排長度 –