yaml :: syck生成列表而不是哈希



如果我运行以下脚本,则两个哈希是相同的,但是当我查看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;

答案

YAML::Syck(如YAML)期望hashref,而不是hash

print F YAML::Syck::Dump(%c);

LoadFile还返回hashref,而不是hash

my $cfg = YAML::Syck::LoadFile($config);    
print Dumper $cfg;

其他改进

首先,您真的不需要our。您的%c%main::c几乎相同。our创建了 package 变量的别名。这不是您想要的。您应该只通过my,e使用常规示波器变量。G。my %c

open与FileHandle一起被视为一个好练习,而是使用标量:

open(my $fh, '>', $config);

您也可以使用$fh->print而不是print $fh。如果您仍然喜欢使用print $fh,则应改用print {$fh}(根据Conway)。

最新更新