如何在perl中打印[哈希] *哈希哈希值作为CSV

时间:2012-07-26 07:20:18

标签: perl csv hash-of-hashes

我想以哈希值打印散列哈希值(深度不确定)。

想象一下,我有一个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行中缺失。

1 个答案:

答案 0 :(得分: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