使用 YAML::XS 控制 hashref 的顺序

Posted

技术标签:

【中文标题】使用 YAML::XS 控制 hashref 的顺序【英文标题】:Control order of hashref with YAML::XS 【发布时间】:2015-01-26 20:41:34 【问题描述】:

我正在使用 YAML::XS 库将数据结构转储到 YAML:

foo => 
    bar => [
        ...,
        ...,
    ],
    baz => [
        ...,
        ...,
    ], 
    ...

YAML::XS 的默认行为似乎是在转储密钥之前对其进行排序,但这不是我想要的。人类必须阅读和编辑这个脚本的输出,所以可读性是一个问题。有没有办法控制转储密钥的顺序,以便 foo->baz 出现在 foo->bar 之前?

【问题讨论】:

文档是here 您可以使用 YAML.pm 的 Bless 来执行此操作,但不确定是否可以使用 YAML::XS。 @ikegami 我已经读过了,它没有回答我的问题 @Floegipoky,确实如此。 @ThisSuitIsBlackNot 我最终将YAML::XS 换成了YAML,非常感谢您指出Bless 功能。它比我想用的更强大,但它完成了工作。对于未来的查看者,请注意,除非您在写入时确切知道您期望哪些键,否则您必须检查您正在 Blessing 的每个节点。另请注意,如果密钥不存在,它将生成一个虚拟条目,因此请确保首先检查是否存在:my $blessarray = []; push $blessarray, 'optionalkey' if $table->optionalkey; 【参考方案1】:

从docs 中可以看出,没有配置哈希顺序的选项。通过查看LibYAML/perl_libyaml.c 中的dump_nodedump_hash 进一步证实了这一点。

【讨论】:

以上是关于使用 YAML::XS 控制 hashref 的顺序的主要内容,如果未能解决你的问题,请参考以下文章

fetchrow_hashref 是不是返回默认值?

文本::CSV by hashref

Perl fetchrow_hashref 结果是不同的整数与字符串值

安装 Perl 模块时出现“致命错误:找不到‘EXTERN.h’文件”

什么是openGL中的顺时针面

Perl Moose 属性句柄设置方法