如何使用Perl的YAML :: Tiny走YAML树?

我有一个这样的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函数.

在这里错过了什么?

解决方法

尝试
print "$_\n" for keys %{ $configuration->[0] };

你必须强制数组元素“$configuration-> [0]”进入带有“%{…}”的哈希引用

所以迭代它们:

for my $key ( keys %{ $configuration->[0] } ){
  my $value = $configuration->[0]{$key};

  print "$key => $value\n";
}

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...