YAML::Syck 生成列表而不是哈希
YAML::Syck generates list instead of hash
如果我 运行 下面的脚本,那么两个哈希是相同的,但是当我查看 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
)expects hashref
,而不是hash
:
print F YAML::Syck::Dump(\%c);
还有LoadFile
returnshashref
,不是hash
:
my $cfg = YAML::Syck::LoadFile($config);
print Dumper $cfg;
其他改进
首先,这里你真的不需要our
。您的 %c
与 %main::c
的含义几乎相同。 our
为 package 变量创建别名。这不是你想要的。您应该只通过 my
使用常规范围的变量,例如。 G。 my %c
.
将 open
与文件句柄一起使用不再被认为是一种好的做法,请改用标量:
open(my $fh, '>', $config);
您也可以使用 $fh->print
而不是 print $fh
。如果您仍然喜欢使用 print $fh
,则应该使用 print {$fh}
(根据 Conway)。
如果我 运行 下面的脚本,那么两个哈希是相同的,但是当我查看 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
)expects hashref
,而不是hash
:
print F YAML::Syck::Dump(\%c);
还有LoadFile
returnshashref
,不是hash
:
my $cfg = YAML::Syck::LoadFile($config);
print Dumper $cfg;
其他改进
首先,这里你真的不需要our
。您的 %c
与 %main::c
的含义几乎相同。 our
为 package 变量创建别名。这不是你想要的。您应该只通过 my
使用常规范围的变量,例如。 G。 my %c
.
将 open
与文件句柄一起使用不再被认为是一种好的做法,请改用标量:
open(my $fh, '>', $config);
您也可以使用 $fh->print
而不是 print $fh
。如果您仍然喜欢使用 print $fh
,则应该使用 print {$fh}
(根据 Conway)。