【问题标题】:How to preserve boolean type from YAML document in Perl 5?如何在 Perl 5 中保留 YAML 文档中的布尔类型?
【发布时间】:2015-12-22 04:39:15
【问题描述】:

我有一个包含布尔值的 YAML 文档:

---
ok: false

我想在 Perl 5 中加载它并保留“布尔”类型,以便以后能够使用 true/false 值而不是 ""/"1" 将文档正确序列化为 JSON。

我编写的以下转换器无法保留布尔值:

#!/usr/bin/env perl

use strict;
use warnings;

use YAML::XS qw<LoadFile>;
use JSON::MaybeXS ();

print JSON::MaybeXS->new->ascii->pretty->canonical->encode(LoadFile shift)

这是(损坏的)输出:

{
   "fine" : ""
}

我希望某些 YAML 加载器中存在一些钩子来将 true/false 映射到 JSON::true/JSON::false$Types::Serialiser::true/$Types::Serialiser::false

【问题讨论】:

标签: json perl boolean yaml


【解决方案1】:

如果存在这样的 YAML 模块,它必须是一个非常晦涩难懂的模块。您在此处使用的 YAML::XS 只是将 YAML 数据中的布尔值转换为标准内部值 PL_sv_yesPL_sv_no,而这些(据我所知)无法识别为特殊值。

从积极的方面来说,修补 YAML::XS 以将 Types::Serialiser 用于布尔值并发送拉取请求似乎非常简单。

【讨论】:

  • YAML::Syck 使用字符串作为布尔值,但我认为 YAML::XS 的行为可能更正确,因此不是切换的好理由。请参阅 PerlMonks 上 YAML::XS, YAML::Syck and boolean values 中的讨论。
  • 我将 YAML::XS 行为称为错误 - 将 &PL_sv_no/yes 直接粘贴到结构中没有任何优势(如上所述),但它们破坏了 perl 数据模型: 没有分配或修改。我什至可以构建这是一个安全漏洞的案例,因为可以控制 YAML 数据的攻击者可能会引发意外的运行时异常,这对我来说是一种远距离操作的方式。 Types::Serialiser 布尔值可以从 Perl 中检测到,并且可以像 Perl 标量一样工作,即它们可以被打印、修改、覆盖等等。
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 2017-04-20
  • 2020-11-21
  • 1970-01-01
  • 2019-05-01
  • 2010-09-23
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多