在Perl中生成数据结构

时间:2019-01-17 16:09:22

标签: arrays perl hash

我有Perl“配置文件”,其中包含如下数据结构:

'xyz' => {
    'solaris'  => [
                   "value1",
                   "valueN",
                  ],
    'linux'    => [
                   "valueX",
                   "valueN",
                  ],
},

我叫他们做一个简单的事情:

%config = do '/path/to/file.conf';

现在,我想像这样“生成”配置文件(直接构造数据结构“结构”并将其打印在配置文件中)。 我可以按常规方式填充(数组或其他任何东西)哈希值的哈希,但是之后如何将其转储到配置文件中?

是否有一种干净便捷的方法? 而不需要做诸如:p的肮脏事情

print $FH "'xyz' => {\n";
print $FH "   'solaris'  => [\n";

我“猜” Data :: Dumper可以做到这一点。

谢谢!

1 个答案:

答案 0 :(得分:3)

您要

$Data::Dumper::Terse = 1;

请参见the documentation

  

$ Data :: Dumper :: Terse或$ OBJ-> Terse([NEWVAL])

     

设置后,Data :: Dumper将发出单个非自我引用的值作为原子/术语,而不是语句。这意味着将在可能的情况下避免使用$VAR n个名称,但是建议eval不一定总是可以解析此类输出。

更新(以解决下面的评论):

Data :: Dumper将添加正确的标点符号,以便您准确获取所提供的内容。如果给它一个哈希引用,那么您将得到一个以大括号开头和结尾的字符串。

$ perl -MData::Dumper -E'$Data::Dumper::Terse=1; say Dumper { foo => { bar => "baz" }}'
{
  'foo' => {
             'bar' => 'baz'
           }
}

如果给它一个数组引用,那么您将得到一个以方括号开头和结尾的字符串。

$ perl -MData::Dumper -E'$Data::Dumper::Terse=1; say Dumper [ foo => { bar => "baz" }]'
[
  'foo',
  {
    'bar' => 'baz'
  }
]

如果出于某种原因,您都不想要这些,请给它一个值列表。

$ perl -MData::Dumper -E'$Data::Dumper::Terse=1; say Dumper ( foo => { bar => "baz" })'
'foo'
{
  'bar' => 'baz'
}

如果您有一个哈希引用,并且您不希望周围的花括号(说实话,这似乎是一个奇怪的要求),请先取消引用该引用,然后再将其传递给Dumper()。这样会将哈希引用转换为哈希,然后通过将哈希传递给函数将其“展开”为列表。

$ perl -MData::Dumper -E'$Data::Dumper::Terse=1; $ref = { foo => { bar => "baz" }}; say Dumper %$ref'
'foo'
{
  'bar' => 'baz'
}