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";
    }
}

これは私の一般的な考え方ですが、ハッシュのキーは最初のキーの後に繰り返されることはありません。

前もって感謝します!!!

編集
私はすでにperl5.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と同じです。2つのバー(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 に答える