web-dev-qa-db-ja.com

Perlデータを保存するためにYAMLまたはJSONを使用する必要がありますか?

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

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

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

今日、Perl、YAML、またはJSONでの単純なデータ記述に適した長期的な形式はどれですか?その理由は何ですか?

46
Paul Nathan

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

YAMLの長所

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

YAMLの短所

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

JSONプロ

  • 人間が読める/書くことができる
  • 小さなスペック
  • 良い実装
  • ポータブル
  • Perlish構文
  • YAML 1.2はJSONのスーパーセットです
  • 画面スペースのコンパクトな使用
  • Perlに適したデータ型
  • 多くのものがJSONを処理します

JSON短所

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

XMLの長所

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

XML短所

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

Perl/Data :: Dumper Pros

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

Perl/Data :: Dumper Cons

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

保存可能な長所

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

保存可能な短所

  • 人間の敵対
  • 保存可能なバージョン間で互換性がない
  • 移植不可(他の言語へ)
80
Schwern

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

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

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

13
Adam Bellaire

これが主な関心事である場合は、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"
  ]
}
9
PHPst

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

YAMLは祝福された変数を保存およびロードすることができ、デフォルトでそれを行います(以下のスニペットはEmacsの*sepia-repl*バッファーからコピーされました):

I need user feedback!  Please send questions or comments to [email protected].
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
hillu

javaScript Object Notationを検討している場合は、「PerlObjectNotation」を使用してみませんか?

JSON:

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

Perl:

{name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]}
1
Eric Strom

プロセスの途中でYMLを読み取ることができるため、プロセスのステータスを追跡するためにYAMLを使用します。 XMLまたはJSを読み取るには、(技術的に)完全に形成されたドキュメントが必要です。 YAMLは、ファイルに多数のミニドキュメントを書き込むことができるため、ステータスの追跡に適しています。それ以外の場合、私は通常XMLまたはJSを使用します。上記の長所と短所の素晴らしい要約、ところで。

0
limeri

Storable の使用を検討することもできます。あなたはおそらくそれで非常に良いスピードブーストを得るでしょう。トレードオフは次のとおりです。

  • storable形式はバイナリであり、JSONやYAMLのように人間が読める形式ではありません
  • Storableは純粋なPerlモジュールではありません(それが重要な場合)
0
codelogic