Как распечатать хэш хэшей [хэшей]* в формате CSV в Perl

Я хочу напечатать хэш хэшей хэшей (с неопределенной глубиной) в формате CSV.

Представьте, что у меня есть структура foos, bar, 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.


person Turbokiwi    schedule 26.07.2012    source источник
comment
Это прекрасно работает в Perl v5.14 и более поздних версиях, где keys с радостью принимает хеш-ссылку вместо хеша. Вам следует подумать об обновлении.   -  person Borodin    schedule 26.07.2012


Ответы (1)


Получил это сейчас, я думаю, это то, что вы хотите:

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
person mihaisimi    schedule 26.07.2012