ВСЕГДА используйте use strict; use warnings;
(или эквивалентный). Это вызвало бы некоторые проблемы.
Ваш вопрос не имеет никакого отношения к YAML. Речь идет о навигации по структуре данных, создаваемой YAML. Итак, давайте начнем с использования следующего, чтобы узнать больше о структуре данных:
use Data::Dumper;
print(Dumper($config));
Мы получаем:
$VAR1 = {
'sheet' => 'filename.exe',
'book' => 'bookname',
'characters' => [
{
'amy' => 'mother'
},
{
'mark' => 'father'
},
{
'dave' => 'son'
}
]
};
Мы заботимся только о $config->{characters}
, который является справочным в массив (как показано []
), поэтому мы будем иметь что-то следующего вида:
my %characters;
for (@{ $config->{characters} }) {
...
}
Каждый элемент массива - это ha sh, содержащий один символ. Мы можем использовать %h = (%h, %extra);
для объединения.
my %characters;
for my $character_container (@{ $config->{characters} }) {
%characters = ( %characters, %$character_container);
}
Альтернатива:
my %characters;
for my $character_container (@{ $config->{characters} }) {
@characters{ keys(%$character_container) } = values(%$character_container);
}
Вот и все!
Обратите внимание, что формат вашего файла довольно странный. Это должно быть:
sheet : filename.exe
book : bookname
characters :
amy : mother
mark : father
dave : son
Это дает
$VAR1 = {
'book' => 'bookname',
'characters' => {
'mark' => 'father',
'dave' => 'son',
'amy' => 'mother'
},
'sheet' => 'filename.exe'
};
И решение становится
my $characters = $config->{characters};
Хорошо, возможно, ваш вопрос как-то связан с YAML после всех :)
@ tooli c * одобряет использование
foreach my $key (keys %{ $config }) {
next if ($key ne "characters");
...$config->{$key}...
}
Но это особенно плохой способ написания
if ( my $characters = $config->{$key} ) {
...$characters...
}
Мы специально используем хэши, чтобы иметь возможность искать элементы по их ключу. Перебор всех элементов для поиска по одному не имеет смысла. (Я довел это до их сведения, но они оставили плохую практику на месте.)