在过去的6个月左右,我一直在使用YAML格式取得了一定的成功。
但是,YAML解析器的纯Perl实现是公平的 烦人的手写可读文件和(在我看来) 恼人的怪癖,比如在文件末尾要求换行。这也是 与我的其他计划相比,这个计划非常缓慢。
我正在思考我的项目的下一个演变,我正在考虑 使用JSON(YAML的一个大部分严格的子集,因为它转向 出)。但是哪种格式在Perl中拥有最多的社区牵引力和努力?
今天看来,这是更简单的长期格式 Perl,YAML或JSON中的数据描述,为什么?
答案 0 :(得分:80)
YAML vs JSON在Perl中并没有得到解决,我承认我倾向于处于中间位置。我会建议,或者要让你获得尽可能多的社区牵引力。我会根据格式的各种优缺点做出决定。我分解了各种数据序列化选项(我要去社区维基,所以人们可以添加它):
YAML专业人士
YAML缺点
JSON专业人士
JSON Cons
XML专业人士
XML缺点
Perl / Data :: Dumper Pros
Perl / Data :: Dumper Cons
可存储优势
可存储的消息
答案 1 :(得分:13)
与大多数事情一样,取决于。我想如果你想要速度和互操作性(与其他语言一样),请使用JSON,特别是JSON::XS。
如果你想要Perl模块永远使用的东西,坚持使用YAML。在CPAN上找到支持使用YAML或依赖于YAML的数据描述的Perl模块比JSON更常见。
请注意,我不是权威,这种观点主要基于预感和猜想。特别是,我没有描述JSON :: XS与YAML::XS。如果我在进攻上无知,我只能希望我会让某人愤怒,通过纠正我来为讨论带来有用的信息。
答案 2 :(得分:9)
这完全取决于人类的可读性,如果这是你主要考虑的选择YAML:
YAML:
american:
- Boston Red Sox
- Detroit Tigers
- New York Yankees
national:
- New York Mets
- Chicago Cubs
- Atlanta Braves
JSON:
{
"american": [
"Boston Red Sox",
"Detroit Tigers",
"New York Yankees"
],
"national": [
"New York Mets",
"Chicago Cubs",
"Atlanta Braves"
]
}
答案 3 :(得分:4)
纯Perl YAML实现(YAML
模块而不是YAML::Syck
)似乎存在一些严重问题。我最近遇到了无法处理YAML文档的问题,这些文档的行很长(大约32k个字符)。
YAML能够存储和加载有福的变量,并且可以这样做
默认(下面的代码段是从*sepia-repl*
缓冲区中复制而来的
emacs的):
I need user feedback! Please send questions or comments to seano@cpan.org.
Sepia version 0.98.
Type ",h" for help, or ",q" to quit.
main @> use YAML
undef
main @> $foo = bless {}, 'asdf'
bless( {}, 'asdf' )
main @> $foo_dump = YAML::Dump $foo
'--- !!perl/hash:asdf {}
'
main @> YAML::Load $foo_dump
bless( {}, 'asdf' )
这在安全方面非常可怕,因为可以使用不受信任的数据
调用已在您的应用程序中定义的任何DESTROY
方法
- 或其使用的任何模块。
以下简短程序演示了这个问题:
#!/usr/bin/perl
use YAML;
use Data::Dumper;
package My::Namespace;
sub DESTROY {
print Data::Dumper::Dumper \@_;
}
package main;
my $var = YAML::Load '--- !!perl/hash:My::Namespace
bar: 2
foo: 1
';
默认情况下,JSON不允许这样做 - 可以序列化 Perl“对象”,但为了做到这一点,你必须定义TO_JSON 方法
答案 4 :(得分:1)
如果您正在考虑JavaScript Object Notation,为什么不使用“Perl Object Notation”?
JSON:
{"name": "bob", "parents": {"mother": "susan", "father": "bill"}, "nums": [1, 2, 3]}
的Perl:
{name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]}
答案 5 :(得分:0)
您可能还想考虑使用Storable。你可能会获得非常好的速度提升。权衡取舍是:
答案 6 :(得分:0)
我使用YAML来跟踪进程的状态,因为我可以在进程的中间读取YML。您(技术上)需要完全形成的文档来读取XML或JS。 YAML非常适合跟踪状态,因为您可以将大量迷你文档写入文件。否则,我通常使用XML或JS。专业人士的精彩摘要缺点,顺便说一下。