我应该使用YAML或JSON来存储我的Perl数据吗?

时间:2009-12-09 20:40:46

标签: perl json yaml

在过去的6个月左右,我一直在使用YAML格式取得了一定的成功。

但是,YAML解析器的纯Perl实现是公平的 烦人的手写可读文件和(在我看来) 恼人的怪癖,比如在文件末尾要求换行。这也是 与我的其他计划相比,这个计划非常缓慢。

我正在思考我的项目的下一个演变,我正在考虑 使用JSON(YAML的一个大部分严格的子集,因为它转向 出)。但是哪种格式在Perl中拥有最多的社区牵引力和努力?

今天看来,这是更简单的长期格式 Perl,YAML或JSON中的数据描述,为什么?

7 个答案:

答案 0 :(得分:80)

YAML vs JSON在Perl中并没有得到解决,我承认我倾向于处于中间位置。我会建议,或者要让你获得尽可能多的社区牵引力。我会根据格式的各种优缺点做出决定。我分解了各种数据序列化选项(我要去社区维基,所以人们可以添加它):

YAML专业人士

  • 人性化,人们在不知情的情况下写出基本的YAML
  • WYSIWYG strings
  • 富有表现力(具有TMTOWDI性质)
  • Expandable type/metadata system
  • Perl兼容数据类型
  • 便携式
  • 熟悉(很多内联和字符串语法看起来像Perl代码)
  • 如果你有一个编译器(YAML :: XS)
  • ,那就是好的实现
  • 转储Perl数据的良好能力
  • 紧凑使用屏幕空间(可以,您可以格式化以适合一行)

YAML缺点

  • Large spec
  • 不可靠/不完整的纯Perl实现
  • 空格,因为语法可能会引起争议。

JSON专业人士

  • 人类可读/可写
  • 小规格
  • 良好的实施
  • 便携式
  • Perlish语法
  • YAML 1.2 is a superset of JSON
  • 紧凑使用屏幕空间
  • Perl友好数据类型
  • 很多东西都处理JSON

JSON Cons

  • 字符串不是WYSIWYG
  • 无可扩展性
  • 某些Perl结构必须以ad-hoc(对象和全局)
  • 表示
  • 缺乏表达能力

XML专业人士

  • 广泛使用
  • Web开发人员熟悉的语法
  • 良好的XML模块的大型语料库
  • 架构
  • 搜索和转换数据的技术
  • 便携式

XML缺点

  • 让人类阅读和写作繁琐
  • Perl的外来数据结构
  • 缺乏表达能力
  • 大规格
  • 冗长

Perl / Data :: Dumper Pros

  • 无依赖性
  • 令人惊讶的紧凑(带有正确的旗帜)
  • Perl friendly
  • 几乎可以转储任何内容(通过DDS
  • 表现
  • 紧凑使用屏幕空间
  • WYSIWYG strings
  • 熟悉

Perl / Data :: Dumper Cons

  • 非便携式(使用其他语言)
  • 不安全(没有英雄措施)
  • 不可理解的非Perl程序员

可存储优势

  • 紧凑? (没有数字备份)
  • 快? (没有数字备份)

可存储的消息

  • 人类敌对
  • 不兼容Storable版本
  • 非便携式(使用其他语言)

答案 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。你可能会获得非常好的速度提升。权衡取舍是:

  • 可存储格式是二进制格式,不像JSON或YAML那样是人类可读的
  • Storable不是纯粹的Perl模块(如果重要的话)

答案 6 :(得分:0)

我使用YAML来跟踪进程的状态,因为我可以在进程的中间读取YML。您(技术上)需要完全形成的文档来读取XML或JS。 YAML非常适合跟踪状态,因为您可以将大量迷你文档写入文件。否则,我通常使用XML或JS。专业人士的精彩摘要缺点,顺便说一下。