YAML :: Syck生成列表而不是哈希

时间:2015-05-13 11:46:02

标签: perl yaml

如果我运行下面的脚本,那么两个哈希是相同的,但当我看看yaml文件的外观时,我看到这种非常奇怪的格式

--- nicPri
--- ixgbe1
--- nicPub
--- ixgbe2
--- slaves
--- 
47: 10.10.47.47
48: 10.10.10.48
--- ipPri
--- 10.10.10.46

它看起来不像普通的yaml文件。我本以期待这样的事情

---
users:
  abc: abc
  ssd: www
01102:
  members:
    - abc
    - ssd
---

问题

任何人都可以看到为什么我这种奇怪的yaml格式?

#!/usr/bin/perl
use strict;
use YAML::Syck;
use warnings;
use Data::Dumper;

our %c = (
    slaves => {
        "47" => "10.10.47.47",
        "48" => "10.10.10.48",
    },
    ipPri         => "10.10.10.46",
    nicPub        => "ixgbe2",
    nicPri        => "ixgbe1",
);

our $config = "/tmp/config.yaml";

# create new yaml file
system("rm -f $config");
open F, '>', $config;
print F YAML::Syck::Dump(%c);
close F;
my %cfg = YAML::Syck::LoadFile($config);

print Dumper \%cfg;
print Dumper \%c;

1 个答案:

答案 0 :(得分:4)

答案

YAMLhashrefexpects hash,而不是print F YAML::Syck::Dump(\%c);

LoadFile

同样hashref会返回hash,而不是my $cfg = YAML::Syck::LoadFile($config); print Dumper $cfg;

our

其他改进

首先,你真的不需要%c。您的%main::cour几乎相同。 my变量创建别名。这不是你想要的。您应该通过my %c使用常规范围的变量,e。 G。 open

open(my $fh, '>', $config); 与文件句柄一起使用不再是一种好习惯,而是使用标量:

$fh->print

此外,您可以使用print $fh代替print $fh。如果您仍然希望使用print {$fh},则应使用json:代替(根据Conway)。