私はYAML形式を使用しており、過去6か月ほどでかなりの成功を収めています。
ただし、YAMLパーサーの純粋なPerl実装は、読み取り可能なファイルを手書きするのがかなり面倒であり、(私の意見では)ファイルの最後に改行が必要になるなどの厄介な癖があります。また、私のプログラムの他の部分と比較して、非常に遅いです。
私は自分のプロジェクトの次の進化について考えており、代わりにJSONを使用することを検討しています(結局のところ、YAMLのほとんど厳密なサブセット)。しかし、どのフォーマットがPerlで最もコミュニティの牽引力と努力を持っていますか?
今日、Perl、YAML、またはJSONでの単純なデータ記述に適した長期的な形式はどれですか?その理由は何ですか?
YAMLとJSONは、Perlではあまり解決されていないものであり、私はその真っ只中にいる傾向があることを認めます。どちらかがあなたに同じくらい多くのコミュニティの牽引力をもたらすだろうと私はアドバイスします。フォーマットのさまざまな長所と短所に基づいて決定します。私はそのようにさまざまなデータシリアル化オプションを分解します(人々がそれに追加できるようにこれをコミュニティウィキに行きます):
YAMLの長所
YAMLの短所
JSONプロ
JSON短所
XMLの長所
XML短所
Perl/Data :: Dumper Pros
Perl/Data :: Dumper Cons
保存可能な長所
保存可能な短所
ほとんどのものと同様に、それは依存します。速度と相互運用性(他の言語との)が必要な場合は、特にJSONを使用すると思います JSON :: XS 。
Perlモジュールでのみ使用されるものが必要な場合は、YAMLを使用してください。 JSONよりも、YAMLを使用したデータ記述をサポートする、またはYAMLに依存するPerlモジュールをCPANで見つけるのがはるかに一般的です。
私は権威ではなく、この意見は主に予感と推測に基づいていることに注意してください。特に、JSON :: XSと YAML :: XS のプロファイルを作成していません。私が攻撃的に無知であるならば、私は私を訂正することによって議論に有用な情報をもたらすのに十分な怒りを誰かに与えることを望むだけです。
これが主な関心事である場合は、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"
]
}
純粋な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メソッドを定義する必要があります。
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]}
プロセスの途中でYMLを読み取ることができるため、プロセスのステータスを追跡するためにYAMLを使用します。 XMLまたはJSを読み取るには、(技術的に)完全に形成されたドキュメントが必要です。 YAMLは、ファイルに多数のミニドキュメントを書き込むことができるため、ステータスの追跡に適しています。それ以外の場合、私は通常XMLまたはJSを使用します。上記の長所と短所の素晴らしい要約、ところで。
Storable の使用を検討することもできます。あなたはおそらくそれで非常に良いスピードブーストを得るでしょう。トレードオフは次のとおりです。