Получить все узлы из многоуровневого хэша в Perl
Я хочу, чтобы все узлы каждого ключа были отсортированы по ключу в хэш-ссылке или массиве или что-то в этом роде, чтобы я мог выполнять итерацию в соответствии с моими потребностями, поскольку мне нужно отображать каждый ключ со всеми его дочерними элементами. ниже моя структура данных:
$hash1 = {
'3' => {
'title' => 'Parent-3',
'parentid' => '-1'
},
'1' => {
'children' => {
'11' => {
'title' => 'child-1',
},
'5' => {
'children' => {
'8' => {
'title' => 'first child of child-2',
},
'13' => {
'title' => 'second child of child-2',
}
},
'title' => 'child-2',
}
},
'title' => 'Parent-1',
'parentid' => '-1'
},
'2' => {
'title' => 'Parent-2',
'parentid' => '-1'
},
'4' => {
'title' => 'Parent-4',
'parentid' => '-1'
},
};
Я использовал следующие функции:
sub Options {
my $hash = shift;
my $options = '';
my $iter; $iter = sub {
my $hash = shift;
my $indent = shift || '';
foreach my $k (sort {$a <=> $b} keys %{$hash}) {
my $v = $hash->{$k};
if($v->{parentid} eq '-1'){
$options .= $v->{title} ."-parent\n";
}else{
$options .= $v->{title} . "," ;
}
if ($v->{children}){
$iter->($v->{children}, $indent . "");
}
}
chop($options);
$options .= "\n";
};
$iter->($hash);
return $options;
}
здесь он возвращает строку с разделенными запятыми, но мне нужна какая-то структура данных, чтобы я мог найти все дочерние элементы для каждого ключа (в виде хэш-ссылки или массива), например:
Parent-1 -> [child-1,child-2, first child of child-2, second child of child-2]
Parent-2
Parent-3
Parent-4
кто-нибудь может мне помочь? заранее спасибо.
2 ответа
Если вашей единственной целью является отображение содержимого хеша, вы должны использовать модуль Data::Dumper. Он может быть использован для печати структур данных произвольной сложности с хорошим форматом.
Вам также может пригодиться ответ Брайана Д. Фоя о проверке существования ключа.
Код с кодом для обхода структуры данных и Data::Diver может оказать вам всю необходимую помощь.