今回は、Perl用のライブラリとして、YAML.pm、YAML::Syck.pm、YAML::XSの3つのライブラリを紹介します。
YAML.pm
YAML.pmはPerlで実装されたYAML用ライブラリです。作者のIndyはYAML仕様の策定者です[1]。
インストール
インストールは、管理者権限で「cpan YAML」を実行するだけです(リスト1)。
使い方
YAML.pmの基本的な使い方は、リスト2のとおりです。YAML.pmが提供するのは次の2つだけであり、YAMLストリームの読み込みはできません。
- YAML::Load($string)
- YAMLドキュメントを読み込む
- YAML::Dump($data)
- データをYAMLドキュメントに変換する
タグを変更する
YAML::Syck.pmでタグを変更する方法はないようです。
日本語の扱い
日本語でも問題なく使えるようです。
不具合
筆者が試した限りでは、以下のような不具合がありました。
- YAML::Load()
- 8進数や16進数が解釈されない
- 「null」が解釈されず、文字列の「"null"」となる
- 「true」「false」「yes」「no」「on」「off」が解釈されず文字列のまま
- 日付や日時(timestamp)が解釈されず文字列のまま
- ルート要素がフロースタイルやスカラーだとエラー
- マッピングのマージが未サポート
- マッピングのキーに日本語を指定するとエラーになる場合がある(リスト3)
その他
YAML.pmではパース後のスカラー値はすべて文字列になります。たとえば「[123, 3.14, true]」というYAML文字列をパースすると「['123', '3.14', 'true']」という結果になります。これはYAML.pmの仕様であり、Perlが文字列も数値も区別しないという言語仕様のため、これでも使う上では問題ないそうです。
YAML::Syck.pm
YAML::Syck.pmは、Cで書かれたライブラリであるSyckを、Perlで使えるようにしたライブラリです。
インストール
インストールは、管理者権限で「cpan YAML::Scyk」を実行するだけです(リスト4)。ただしコンパイルのためにCコンパイラが必要です。
使い方
YAML::Syck.pmの基本的な使い方は、リスト5のとおりです。YAML::Syck.pmが提供するのは次の2つだけであり、YAMLストリームの読み込みはできません。
- YAML::Syck::Load($string)
- YAMLドキュメントを読み込む
- YAML::Syck::Dump($data)
- データをYAMLドキュメントに変換する
また必ず$YAML::Syck::ImplicitTypingを1に設定してください。これをしないと、スカラー値がすべて文字列として扱われてしまいます。
タグを変更する
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の作者でもあります。
インストール
インストールは、CPANを使って行ってください(リスト6)。
使い方
YAML::XSの使い方は、モジュール名が変わる以外は基本的にYAML.pmと同じです(リスト7)。
タグを変更する
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の仕様を策定したメンバーだけに、残念です。