[Perl] YAMLは奥が深い

こんばんは。
海外出張から帰国して、一息をついているおじいさんです。
明日は高尾山登山の予定ですが、、台風ですか。のぼれるんでしょうか。さてはてどうなることやら。個人的にはビアで軽く一杯やるだけでいいんですよ。曇りってのが一番うれしいですかね。
さて、本題は、PerlのYAMLモジュールについて、調べていたので記事を一本書いてみました。

YAMLというと、まずココ
 http://yaml.org/

あれ、よく見たら、Ingyが仕様策定に入ってますね。マジですか。
で、PerlのYAMLモジュールはすでにいくつかありまして、たぶんYAML::XSが一番使われているであろうと思ったのですが、さてどうでしょう?

 http://search.cpan.org/dist/YAML/       ★3
 http://search.cpan.org/dist/YAML-LibYAML/ ★5
 http://search.cpan.org/dist/YAML-Syck/   ★4.5
 http://search.cpan.org/dist/YAML-Tiny/   ★4.5

で、ベンチとって見ました。

#!/usr/bin/perl

use Benchmark;
use utf8;
use YAML;
use YAML::XS;
use YAML::Syck;
use YAML::Tiny;

timethese(1000,
   {
     'YAML::Syck' => sub {
       my $conf = YAML::Syck::LoadFile('test.yaml');
     },
     'YAML::Tiny' => sub {
       my $tiny = YAML::Tiny->read( 'test.yaml' );
     },
     'YAML::XS' => sub {
       my $yaml = YAML::XS::LoadFile( 'test.yaml' );
     },
     'YAML' => sub {
       my $yaml = YAML::LoadFile( 'test.yaml' );
     },
   });


結果

Benchmark: timing 1000 iterations of YAML, YAML::Syck, YAML::Tiny, YAML::XS...
YAML: 3 wallclock secs ( 3.21 usr + 0.04 sys = 3.25 CPU) @ 307.69/s (n=1000)
YAML::Tiny: 1 wallclock secs ( 0.35 usr + 0.02 sys = 0.37 CPU) @ 2702.70/s (n=1000)
YAML::Syck: 0 wallclock secs ( 0.12 usr + 0.02 sys = 0.14 CPU) @ 7142.86/s (n=1000)
YAML::XS: 0 wallclock secs ( 0.08 usr + 0.03 sys = 0.11 CPU) @ 9090.91/s (n=1000)


YAML::XS速いッ。
あ、パースに使用したYAMLファイルは内緒です。仕事で使ってる奴なんで。

ところで、これを使っている最中に気づいたのですが、YAMLで*って、Aliasなんですね。
なんでこんな事をしていたかと言うと、マッチング規則をハッシュのvalue値に書いていて、
"match_string: *"をYAML::XSを通したら、エラーが出た。
YAML::SyckとYAML::Tinyは通るんですが、YAML、YAML::XSは通りません。
Alias名が不正と判定されちゃう模様。

ん、これってひょっとしてYAMLの文法違反ですかね?

YAMLの仕様をちゃんと勉強しないと。。。
 日本語での概要
  http://jp.rubyist.net/magazine/?0009-YAML
  →
 YAML1.1
  http://yaml.org/spec/1.1/ 
 YAML1.0
  http://yaml.org/spec/history/2004-01-29/2004-01-29.html#id2563922

現在YAML1.2の仕様Draftが公開されておりますな。

で、Aliasの例をYAML1.0からひっこぬいて、YAML::SyckにかけてData::Dumper。

$VAR1 = {
'anchor' => 'This scalar has an anchor.',
'override' => 'The alias node below is a repeated use of this value.',
'alias' => ${\$VAR1->{'override'}}
};

ヲヲ、マジでエイリアスがかかってる。木構造以外も表現できるDumperの威力に脱帽(そこかヨ!)

冗談はともかくとして、"match_string: *"は、Aliasではないはずなんですが、YAML1.0の仕様書4.1.3.節 Indicatorsにこいつらを一文字目に使うなよ、と書かれています。こいつらの中に"*"も入っています。
なので、YAML::XSの動作は正しいです。

こういう場合は、match_string: "*"とすべきですね。
あー、仕様修正だorz

その後にYAMLの仕様をもう少し詳しくみるかな。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 2

なるほど(納得、参考になった、ヘー)
かわいい

この記事へのコメント

この記事へのトラックバック

  • perlでYAMLを扱うときはYAML::XSを使え!

    Excerpt: perlでYAML形式のファイルを作るor読み込むにはどうしたらいいのか??実はすごく簡単に出来ます。CPANには何でもありますね(・∀・) use YAML;

# ファイルに.. Weblog: (゚∀゚)o彡 sasata299's blog racked: 2009-03-20 21:37