言語別 YAML用ライブラリ徹底解説

第5回Perl編

今回は、Perl用のライブラリとして、YAML.pm、YAML::Syck.pm、YAML::XSの3つのライブラリを紹介します。

YAML.pm

YAML.pmはPerlで実装されたYAML用ライブラリです。作者のIndyはYAML仕様の策定者です[1]⁠。

ダウンロードhttp://search.cpan.org/CPAN/authors/
id/I/IN/INGY/YAML-0.66.tar.gz
ドキュメントhttp://search.cpan.org/~ingy/
YAML-0.66/lib/YAML.pm
バージョン0.66
作者Brian Ingerson、Ingy döt Net

インストール

インストールは、管理者権限で「cpan YAML」を実行するだけですリスト1⁠。

リスト1 YAML.pmのインストール
$ sudo cpan YAML

使い方

YAML.pmの基本的な使い方は、リスト2のとおりです。YAML.pmが提供するのは次の2つだけであり、YAMLストリームの読み込みはできません。

YAML::Load($string)
YAMLドキュメントを読み込む
YAML::Dump($data)
データをYAMLドキュメントに変換する
リスト2 YAML.pmの基本的な使い方(ex-yamlpm.pl)
use strict;
use YAML ();
use Data::Dumper ();

## YAMLドキュメントの読み込み
my $filename = "example.yaml";
open(IN, $filename) or die("cannot open file.");
read(IN, my $input, (-s $filename));
close(IN);
my $ydoc = YAML::Load($input);
print Data::Dumper::Dumper($ydoc);
## または
##   my $ydoc = YAML::LoadFile($filename);

## データをYAMLドキュメントへ変換
print YAML::Dump($ydoc);

タグを変更する

YAML::Syck.pmでタグを変更する方法はないようです。

日本語の扱い

日本語でも問題なく使えるようです。

不具合

筆者が試した限りでは、以下のような不具合がありました。

YAML::Load()
  • 8進数や16進数が解釈されない
  • 「null」が解釈されず、文字列の「"null"」となる
  • 「true」⁠false」⁠yes」⁠no」⁠on」⁠off」が解釈されず文字列のまま
  • 日付や日時(timestamp)が解釈されず文字列のまま
  • ルート要素がフロースタイルやスカラーだとエラー
  • マッピングのマージが未サポート
  • マッピングのキーに日本語を指定するとエラーになる場合があるリスト3
リスト3 日本語をキーにするとエラー
- 姓: フグ田
  名: サザエ

その他

YAML.pmではパース後のスカラー値はすべて文字列になります。たとえば「[123, 3.14, true]」というYAML文字列をパースすると「['123', '3.14', 'true']」という結果になります。これはYAML.pmの仕様であり、Perlが文字列も数値も区別しないという言語仕様のため、これでも使う上では問題ないそうです。

YAML::Syck.pm

YAML::Syck.pmは、Cで書かれたライブラリであるSyckを、Perlで使えるようにしたライブラリです。

YAML::Syck.pmについて

インストール

インストールは、管理者権限で「cpan YAML::Scyk」を実行するだけですリスト4⁠。ただしコンパイルのためにCコンパイラが必要です。

リスト4 YAML::Syck.pmのインストール
$ sudo cpan YAML::Syck

使い方

YAML::Syck.pmの基本的な使い方は、リスト5のとおりです。YAML::Syck.pmが提供するのは次の2つだけであり、YAMLストリームの読み込みはできません。

YAML::Syck::Load($string)
YAMLドキュメントを読み込む
YAML::Syck::Dump($data)
データをYAMLドキュメントに変換する

また必ず$YAML::Syck::ImplicitTypingを1に設定してください。これをしないと、スカラー値がすべて文字列として扱われてしまいます。

リスト5 YAML::Syck.pmの使い方(ex-syckpm.pl)
use strict;
use YAML::Syck ();
use Data::Dumper ();

## YAMLドキュメントの読み込み
my $filename = "example.yaml";
open(IN, $filename) or die("cannot open file.");
read(IN, my $input, (-s $filename));
close(IN);
$YAML::Syck::ImplicitTyping = 1; ## 必須!
my $ydoc = YAML::Syck::Load($input);
print Data::Dumper::Dumper($ydoc);

## データをYAMLドキュメントへ変換
print YAML::Syck::Dump($ydoc);

タグを変更する

YAML::Syckでタグを変更する方法はないようです。

日本語の扱い

読み込み(YAML::Syck::Load())については、日本語でも問題ないようです。

書き出し(YAML::Syck::Dump())については、日本語文字列はたとえば「\xE3\x81\x84」のようにエンコードされます。

不具合

YAML::Syck.pmはSyckを使っているので、RubyのSyckと同じ不具合があります。詳しくはRuby Syckのセクションをご覧ください。

YAML::XS

YAML::XSは、LibYAMLのPerl用バインディングです。作者のIndyはYAML仕様策定者のひとりであり、YAML.pmの作者でもあります。

YAML::XSについて
ダウンロードhttp://search.cpan.org/dist/
YAML-LibYAML/
ドキュメントhttp://search.cpan.org/src/INGY/
YAML-LibYAML-0.26/README
バージョン0.26
作者Ingy döt Net

インストール

インストールは、CPANを使って行ってくださいリスト6⁠。

リスト6 YAML::XSのインストール
$ sudo cpan YAML::XS

使い方

YAML::XSの使い方は、モジュール名が変わる以外は基本的にYAML.pmと同じですリスト7⁠。

リスト7 YAML::XSの基本的な使い方(ex-yamlxs.pl)
use strict;
use YAML::XS ();
use Data::Dumper ();

## YAMLドキュメントの読み込み
my $filename = "example.yaml";
open(IN, $filename) or die("cannot open file.");
read(IN, my $input, (-s $filename));
close(IN);
my $ydoc = YAML::XS::Load($input);
print Data::Dumper::Dumper($ydoc);
## または
##   my $ydoc = YAML::XS::LoadFile($filename);

## データをYAMLドキュメントへ変換
print YAML::XS::Dump($ydoc);

タグを変更する

YAML::XSでタグを変更する方法はないようです。

日本語の扱い

UTF-8であれば、日本語でも問題なく使えるようです。EUC-JPやShift_JISではうまく動作しませんでした。

不具合

筆者が試した限りでは、以下のような不具合がありました。

YAML::XS::Load()
  • 8進数や16進数が解釈されない
  • 「null」が解釈されず、文字列の「"null"」となったまま
  • 「yes」⁠no」⁠on」⁠off」が解釈されず文字列のまま
  • 日付や日時(timestamp)が解釈されず文字列のまま
  • マッピングのマージ(<<)が未サポート
YAML::XS::Dump()
  • 特になし

その他

YAML::XSは、YAML.pmよりはましですが、nullが解釈されないなど基本的なところでのバグが多いです。作者のIndyはYAMLの仕様を策定したメンバーだけに、残念です。

おすすめ記事

記事・ニュース一覧