【发布时间】: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 中提供的链接中进行了讨论。