首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YAML::Syck生成列表而不是散列

YAML::Syck生成列表而不是散列
EN

Stack Overflow用户
提问于 2015-05-13 11:46:01
回答 1查看 104关注 0票数 2

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

代码语言:javascript
复制
--- nicPri
--- ixgbe1
--- nicPub
--- ixgbe2
--- slaves
--- 
47: 10.10.47.47
48: 10.10.10.48
--- ipPri
--- 10.10.10.46

看起来不像普通的yaml文件。我本以为会发生这样的事

代码语言:javascript
复制
---
users:
  abc: abc
  ssd: www
01102:
  members:
    - abc
    - ssd
---

问题

有人能明白我为什么这么奇怪的yaml格式吗?

代码语言:javascript
复制
#!/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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-13 12:15:42

回答

YAML::Syck (as YAML) 期待 hashref,而非hash

代码语言:javascript
复制
print F YAML::Syck::Dump(\%c);

LoadFile还返回hashref,而不是hash

代码语言:javascript
复制
my $cfg = YAML::Syck::LoadFile($config);    
print Dumper $cfg;

其他改进

首先,这里并不需要our。您的%c的含义与%main::c的含义大致相同。our为包变量创建别名。这不是你想要的。您应该通过my (例如,my %c )使用正则作用域变量。

使用带有文件句柄的open不再被认为是一种良好的实践,而是使用标量:

代码语言:javascript
复制
open(my $fh, '>', $config);

另外,您可以使用$fh->print而不是print $fh。如果您仍然喜欢使用print $fh,则应该使用print {$fh} (根据康威)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30213878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档