我有一个像这样的YAML文件:
---
version: 1
rootdirectory:
- subdirectory:
- file1
- file2
- subdirectory2
我正在加载到这样的YAML :: Tiny对象中:
$configuration = YAML::Tiny->read($configuration_file)
我从使用Perl调试器调用脚本时看到,我最终得到的是一组嵌套的哈希和数组,它们反映了YAML源的结构:
0 YAML::Tiny=ARRAY(0x84e3ba4)
0 HASH(0x80627dc)
'rootdirectory' => ARRAY(0x84e3d3c)
0 HASH(0x84352b0)
'subdirectory' => ARRAY(0x84e3df0)
0 'file1'
1 'file2'
1 'subdirectory2'
'version' => 1
所以,我可以毫无问题地做以下事情:
print $configuration->[0]->{version}
并收到'1'的预期答案。同样,我也可以这样做:
print $configuration->[0]->{rootdirectory}->[0]->{subdirectory}->[0]
并收到'file1'的预期答案。
我的问题来自于我在上面的例子中导出文件名所需的所有先验知识。因为我试图允许我的脚本的用户在YAML配置中描述任意目录结构,所以这还不够好。我需要能够从'rootdirectory'“走”树。
所以,我想我可以做这样的事情:
print keys($configuration->[0])
我原本希望返回'rootdirectory,version'......等等,迭代数组和哈希值,直到我走过树。
当我尝试运行上面的例子时,我得到:
Type of arg 1 to keys must be hash (not array element)
此时我被困住了。据我所知,$ configuration-> [0]虽然是数组的元素,但是包含哈希的元素,我相信我应该可以调用key函数。
我在这里缺少什么?
答案 0 :(得分:6)
尝试
print "$_\n" for keys %{ $configuration->[0] };
您必须将数组元素“$configuration->[0]
”强制转换为带有“%{...}
”的哈希引用
所以要迭代它们:
for my $key ( keys %{ $configuration->[0] } ){
my $value = $configuration->[0]{$key};
print "$key => $value\n";
}
答案 1 :(得分:3)
YAML::Tiny
创建了一个相当复杂的数据结构:
对数组的引用 充满了哈希的参考 充满了对数组的引用 充满了哈希的参考 ....
当$a
是对数组的引用时,
你以@ $ a的形式访问整个数组
和$$a[0], $$a[1],
的元素......
或者作为$a->[0], $a->[1]
当$b
是散列的参考时,
您将整个哈希值作为%$b
访问
和元素为$ $b{'somekey'}, $$b{'somekey'},
....
或者作为$b->{'somekey'}, $b->{'somekey'}
当$configuration
是对充满哈希引用的数组的引用时
您以@$configuration
的身份访问整个数组,
第一个元素为$configuration->[0]
。您可以将其复制到另一个变量
$firstconfig = $configuration->[0]
然后以
的形式访问整个哈希%$firstconfig
但如果你想一次性完成,你必须编写相当棘手的
%{ $configuration->[0] }
我认为这是Perl 6已经删除的内容之一。