У меня есть хэш, который представляет собой глубоко вложенную структуру. Уровень вложенности заранее неизвестен. Но у каждого уровня есть два свойства «экземпляр» и еще один хэш «зависимостей». Так что это своего рода рекурсивный хэш.
my $HASH = {
"top"=> {
"instance" => "top_instance",
"dependencies" => {
"sub_block1" => {
"instance" => "sub_block1_instance",
"dependencies" => {}
},
"sub_block2" => {
"instance" => "sub_block2_instance",
"dependencies" => {
"sub_block3" => {
"instance" => "sub_block3_instance",
"dependencies" => {}
}
}
}
}
}
};
У меня есть подпрограмма, которая принимает определяемую пользователем строку и возвращает внутреннюю часть хеша из указанного уровня иерархии.
Например, если пользователь указывает «sub_block2», подпрограмма должна вернуть этот хэш:
{
"sub_block2" => {
"instance" => "sub_block2_instance",
"dependencies" => {
"sub_block3" => {
"instance" => "sub_block3_instance",
"dependencies" => {}
}
}
}
}
Это моя подпрограмма:
sub get_starting_point {
my $string = shift;
my $config = shift;
foreach my $key (keys %$config) {
if($key ne $string) {
# if current key is not what user asked for, recurse into next level of hierarchy
if (exists $$config{$key}{dependencies}) {
&get_starting_point($$config{$key}{dependencies});
}
} else {
# we found the key, return the hash under this hierarchy
my $tempHash = {$key => $$config{$key}};
print ref($tempHash); # correctly prints HASH
print Dumper($tempHash); # correctly prints out the sub-hash
return $tempHash; # I am expecting this return value to be a hash-ref
}
}
}
Как видите, это рекурсивная функция, которая продолжает погружаться глубоко в хэш, пока не наткнется на ключ, соответствующий аргументу, и не вернет полный подхеш под этим ключом.
Вот как я называю эту подпрограмму.
my $subHash = get_starting_point("sub_block2",$HASH);
print ref($subHash); # is not a ref
print Dumper($subHash); # prints nothing
Что я делаю неправильно!?!?
РЕДАКТИРОВАТЬ: Обновлен вопрос с моей точной проблемой. Похоже, простой пример, который я использовал раньше, работал, как ожидалось.