我有一个这样的 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 配置中描述任意目录结构时,这还不够好。我需要能够从“根目录”“走”树。
所以,我会想象我可以做这样的事情:
print keys($configuration->[0])
我本来希望返回 'rootdirectory,version' ......等等,遍历数组和哈希,直到我走过树。
当我尝试运行上面的示例时,我得到:
Type of arg 1 to keys must be hash (not array element)
在这一点上,我被困住了。据我了解,$configuration->[0] 虽然是数组的一个元素,但它是一个包含哈希的元素,我相信我应该能够针对它调用 keys 函数。
我在这里想念什么?