2012-07-26 64 views
2

我想將散列的散列值(具有不確定的深度)以散列形式打印爲CSV。如何在[perl]中將散列[hashes] *的散列值作爲CSV打印

想象一下,我有一個foos,bars,cars ......的結構,其中最深的哈希鍵指向一個數字標量。

我想打印這個結構是這樣的:

foo1;bar1;car1;345 
foo1;bar1;car2;25347 
foo1;bar2;car1;23 
foo2;bar1;car1;863 
...... 
...... 

是否有人知道如何做到這一點,當你不知道哈希結構的深度(也可能有額外的火星和戰爭等)?

到目前爲止我試過了什麼?

sub print_csv { 
    my $subj = shift; 
    if (ref($subj) eq "HASH") { 
     for (keys $subj) { 
      print "$_;"; 
      print_csv($subj->{$_}); 
     } 
    } 
    else { 
     print "$subj\n"; 
    } 
} 

這是我的一般想法,但散列的關鍵將不會在第一個之後重複。

在此先感謝!

編輯
我已經在使用perl 5.14了。我的問題是,哈希鍵在第一次出現後不會重複。我的電流輸出是這樣的:

foo1;bar1;4 
foo2;bar2;12060 
bar3;24 
bar1;152 
foo3;bar3;1 
bar1;815 

foo2的有3條(BAR1,BAR2,BAR3),但它的名字「foo2的」在線路3和4,不重複它與foo3相同。它有兩間酒吧(BAR1和BAR3),但它的名字「foo3」中缺少線6

+0

這工作得很好Perl的v5.14及更高版本,其中'keys'愉快地接受hashref,而不是一個哈希值。你應該考慮升級。 – Borodin 2012-07-26 07:51:23

回答

3

現在知道了,我覺得這是你想要什麼:

sub print_csv { 
    my $subj = shift; 
    my $prefix = shift || ""; 
    if (ref($subj) eq "HASH") { 
     for (keys %$subj) { 
      print_csv($subj->{$_}, $prefix ."$_;"); 
     } 
    } 
    else { 
     print "$prefix$subj\n"; 
    } 
} 

數據:

my %hash =(); 
my %hash2 =(); 
my %hash3 =(); 

$hash3{"test3Key"}="test5"; 
$hash2{"test2Key"}=\%hash3; 
$hash2{"test2Key2"}="test2Key2Value"; 
$hash{"testSimpleKey"} = "test2"; 
$hash{"testHashRefKey"}=\%hash2; 

結果:

testSimpleKey;test2 
testHashRefKey;test2Key;test3Key;test5 
testHashRefKey;test2Key2;test2Key2Value 
+0

就是這樣!你是我的伴侶:) – Turbokiwi 2012-07-26 08:30:14