Редактировать : вопреки здравому смыслу, я попытаюсь ответить на этот вопрос снова.
Вот простой подход к печати того, что вы хотите. Использование Data :: Walk неосуществимо, потому что у вас нет ключевого контекста, когда вы находитесь внутри хеша (вы просто получаете указатель на контейнер.)
Эта функция работает для довольно сложных структур. Конечно, это не даст правильного вывода, если вы поместите туда ссылку на функцию или что-то непонятное.
use strict;
use warnings;
my $res;
sub walk {
my ($item, $path) = @_;
if (ref $item eq 'ARRAY') {
foreach (@$item) {
walk($_, $path);
}
} elsif (ref $item eq 'HASH') {
foreach (keys %$item) {
push @$path, $_;
walk($item->{$_}, $path);
pop @$path;
}
} else {
print join('-', @$path, $item), "\n";
}
}
my $struct = {
a => {
a1 => { a11 => [ 1, 2, 3 ] },
a2 => { a22 => [5, 6, 7] }
},
b => { b1 => [ 99 ], },
c => [ 100, 101, ],
d => [ 101, { d2 => { d3 => [200, 210] }, }, ],
};
walk $struct;