51

私は YAML 形式を使用しており、過去 6 か月ほどでかなりの成功を収めています。

ただし、YAML パーサーの純粋な Perl 実装は、読み取り可能なファイルを手書きするのが非常に面倒であり、(私の意見では) ファイルの最後に改行が必要になるなどの厄介な癖があります。また、私のプログラムの他の部分に比べて非常に遅いです。

私は自分のプロジェクトの次の進化を考えており、代わりに JSON を使用することを検討しています (結局のところ、YAML のほとんどが厳密なサブセットです)。しかし、どの形式が Perl で最もコミュニティの牽引力と努力を持っているのでしょうか?

今日、Perl、YAML、または JSON での単純なデータ記述の長期的なフォーマットとして、どちらが優れているように見えますか?またその理由は?

4

7 に答える 7

84

YAMLとJSONは、Perlで解決されていないものであり、私はその真っ只中にいる傾向があることを認めます。どちらかがあなたに同じくらい多くのコミュニティの牽引力をもたらすだろうと私はアドバイスします。フォーマットのさまざまな長所と短所に基づいて決定します。私はそのようなさまざまなデータシリアル化オプションを分解します(人々がそれに追加できるように、これをコミュニティwikiに移動します):

YAMLの長所

  • 人間に優しい、人々はそれを知らなくても基本的なYAMLを書く
  • WYSIWYG文字列
  • 表現力豊か(TMTOWDIの性質を持っています)
  • 拡張可能なタイプ/メタデータシステム
  • Perl互換のデータ型
  • ポータブル
  • おなじみ(多くのインラインおよび文字列構文はPerlコードのように見えます)
  • コンパイラー(YAML :: XS)を使用している場合の適切な実装
  • Perlデータをダンプする優れた機能
  • 画面スペースのコンパクトな使用(可能、1行に収まるようにフォーマットできます)

YAMLの短所

  • ラージスペック
  • 信頼できない/不完全な純粋なPerl実装
  • 構文としての空白は論争になる可能性があります。

JSONの長所

  • 人間が読み取り/書き込み可能
  • 小さなスペック
  • 良い実装
  • ポータブル
  • Perlish構文
  • YAML1.2はJSONのスーパーセットです
  • 画面スペースのコンパクトな使用
  • Perlに適したデータ型
  • 多くのものがJSONを処理します

JSONの短所

  • 文字列はWYSIWYGではありません
  • 拡張性なし
  • 一部のPerl構造は、アドホックに表現する必要があります(オブジェクトとグロブ)
  • 表現力の欠如

XMLの長所

  • 広く使われている
  • Web開発者に馴染みのある構文
  • 優れたXMLモジュールの大規模なコーパス
  • スキーマ
  • データを検索および変換するテクノロジー
  • ポータブル

XMLの短所

  • 人間が読み書きするのは面倒です
  • Perlにとって外部のデータ構造
  • 表現力の欠如
  • ラージスペック
  • 詳細

Perl / Data :: Dumper Pros

  • 依存関係なし
  • 驚くほどコンパクト(適切なフラグ付き)
  • Perlフレンドリー
  • ほとんど何でもダンプできます(DDS経由)
  • 表現力豊か
  • 画面スペースのコンパクトな使用
  • WYSIWYG文字列
  • 見慣れた

Perl / Data::Dumperの短所

  • 非移植性(他の言語へ)
  • 安全でない(英雄的な手段なしで)
  • Perl以外のプログラマーには不可解です

保存可能な長所

  • コンパクト?(それをバックアップするための番号はありません)
  • 速い?(それをバックアップするための番号はありません)

保存可能な短所

  • 人間の敵対
  • 保存可能なバージョン間で互換性がない
  • 非移植性(他の言語へ)
于 2009-12-09T23:28:20.710 に答える
13

ほとんどのものと同様に、それは依存します速度と相互運用性 (他の言語との) が必要な場合は、JSON、特にJSON::XSを使用すると思います。

Perl モジュールでのみ使用されるものが必要な場合は、YAML を使用してください。JSON よりも、YAML を使用したデータ記述をサポートする、または YAML に依存する Perl モジュールを CPAN で見つける方がはるかに一般的です。

私は権威ではなく、この意見は主に直感と推測に基づいていることに注意してください. 特に、私は JSON::XS とYAML::XSのプロファイルを作成していません。もし私が攻撃的に無知であるなら、誰かを怒らせて、私を正すことで議論に有用な情報をもたらすことができることを願っています.

于 2009-12-09T20:54:45.543 に答える
11

人間が読みやすいことがすべてです。これが主な関心事である場合は、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"
  ]
}
于 2012-12-19T11:49:28.613 に答える
4

純粋な Perl YAML 実装 (YAMLではなくモジュールYAML::Syck) には、深刻な問題があるようです。最近、非常に長い行 (32k 文字程度) を含む YAML ドキュメントを処理できないという問題に遭遇しました。

YAML は、bless された変数を保存およびロードすることができ、デフォルトで実行されます (以下のスニペット*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 メソッドを定義する必要があります。

于 2009-12-10T14:46:28.360 に答える
1

JavaScript Object Notation を検討しているなら、「Perl Object Notation」を使ってみませんか?

JSON:

{"name": "bob", "parents": {"mother": "susan", "father": "bill"}, "nums": [1, 2, 3]}

パール:

{name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]}
于 2009-12-10T02:56:23.703 に答える
0

Storableの使用を検討することもできます。これにより、非常に優れた速度ブーストが得られる可能性があります。トレードオフは次のとおりです。

  • Storable 形式はバイナリであり、JSON や YAML のように人が読めるものではありません
  • Storable は純粋な Perl モジュールではありません (それが重要な場合)
于 2009-12-09T21:12:47.910 に答える