【问题标题】:Generate a data structure in Perl在 Perl 中生成数据结构
【发布时间】:2019-01-17 16:09:22
【问题描述】:

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

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

我称他们为简单:

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

现在,我想像这样“生成”配置文件(直接构建数据结构“结构”并将其打印在配置文件中)。 我可以以正常方式填充散列(数组或任何东西)的散列,但是我如何在配置文件中转储它?

有没有一种干净简单的方法呢? 而不必做一些肮脏的事情,比如:

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

等等。

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

谢谢!

【问题讨论】:

  • Data::Dumper 和 Data::Dump 就是为此而生的。
  • 谢谢你会试试的
  • 它几乎可以通过 print $FH Dumper ( \%HoH );但它在顶部添加了一个 $VAR1 = { 这很烦人,有没有办法摆脱它?
  • (我的意思是我只需要哈希内容,而不是它的名称),尝试几个选项 atm
  • 冒着“启动某些东西”的风险,如果它要与 perl 以外的东西交互,您可能会查看一些 JSON 模块。我不是 JSON 的忠实粉丝,但在同一个项目中与 perl、javascript 和 java 交互时遇到了它。

标签: arrays perl hash


【解决方案1】:

你想要:

$Data::Dumper::Terse = 1;

the documentation

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

设置后,Data::Dumper 将发出单个非自引用值作为原子/术语而不是语句。这意味着将尽可能避免使用 $VARn 名称,但请注意,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'
}

【讨论】:

  • 非常感谢!几乎像魅力一样工作,只是它在文件的顶部和末尾添加了两个大括号(围绕哈希),将检查我是否可以以任何方式摆脱它们并将问题标记为已解决
  • 非常感谢,非常有道理
猜你喜欢
  • 2015-08-12
  • 2010-09-12
  • 1970-01-01
  • 2014-04-27
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多