2

我想将散列的散列(具有无法定义的深度)打印为 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),但第 6 行中缺少它的名称“foo3”。

4

1 回答 1

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
于 2012-07-26T08:13:00.987 回答