【问题标题】:YAML::Dumper not quoting scalar string "-"YAML::Dumper 未引用标量字符串“-”
【发布时间】:2014-05-27 17:37:22
【问题描述】:

问题:让 Perl 的 YAML::Dumper 发出 {key=>"-"}key: "-" 而不是 key: -

我正在处理来自数据库行的哈希值,使用 SOAP 读取它们并将它们转换为 YAML 以供下一阶段使用。

第一阶段是用 Perl 编写的,并使用 YAML::Dumper 生成 YAML。不幸的是,对于值为 "-" 的键,会发出裸连字符 sans 任何引用:

$ perl -e 'use YAML;use YAML::Dumper; my $ydumper=YAML::Dumper->new(); print $ydumper->dump({key1=>1,key2=>"-",key3=>3});'
--- 
key1: 1
key2: -
key3: 3

读取上述内容并对其执行进一步操作的下一阶段是在 Ruby 中。原始破折号导致 Ruby 的 YAML 解析器变为 varf:

$ ruby -rubygems -ryaml -e 'YAML.load($stdin.read);'  # assume the above piped in
/usr/share/ruby/vendor_ruby/psych.rb:205:in `parse': (<unknown>): block sequence entries are not allowed in this context at line 3 column 7 (Psych::SyntaxError)
    from /usr/share/ruby/vendor_ruby/psych.rb:205:in `parse_stream'
    from /usr/share/ruby/vendor_ruby/psych.rb:153:in `parse'
    from /usr/share/ruby/vendor_ruby/psych.rb:129:in `load'
    from -e:1:in `<main>'

我的问题很简单:如何指示 YAML::Dumper 将破折号作为带引号的字符串发出?

谢谢!

【问题讨论】:

  • 这是 YAML 规范的一部分吗?似乎是 ruby​​ 实现的问题。
  • 看起来它确实可能是 Ruby 实现中的一个错误。 yaml.org/spec/1.2/spec.html#id2759963 表示块序列以 破折号和空格 开头,而这里只有破折号 - 没有尾随空格。
  • 你试过逃避它吗?就像单引号内的双引号。 '\"-\"'
  • yaml.org/spec/1.2/spec.html#id2788859 似乎很重要:“普通标量不能以大多数指标开头,因为这会导致与其他 YAML 结构的歧义。但是,“:”、“?”如果后跟非空格“安全”字符,则“-”指示符可以用作第一个字符,因为这不会引起歧义。” Perl 输出后面没有跟“非空格“安全”字符”,所以问题似乎出在此处。
  • 这是 YAML::Dumper 中的一个错误。您所说的值是标量、字符串或整数,不能是单个、裸露的- 值或- (破折号+空格)。它必须有别的东西。 Ruby 的 YAML 返回块异常是一个红鲱鱼,但这是因为 - 本身或 - (破折号 + 空格)定义了一个块。因此,使用固定版本的 YAML::Dump 或使用 YAML::XS 可以解决问题。这在@snoopy 在his answer 中提供的链接中进行了讨论。

标签: ruby perl yaml


【解决方案1】:

我在 github 上为 YAML::Dumper 创建了一个 pull request,希望能被接受并解决这个问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 2011-10-18
  • 1970-01-01
  • 2012-03-27
  • 2020-09-14
  • 2015-09-30
  • 1970-01-01
  • 2018-09-28
相关资源
最近更新 更多