パール木本のPerlテックブログ

世界的プロジェクトに携わるPerlプログラマー「パール木本」のテックブログ。書籍「業務に役立つPerl」,ユーチューバー, 木本システム代表取締役社長。

PerlのYAML 1.2の解析機 YAML::PPの紹介

PerlのYAML 1.2の解析機 YAML::PPの紹介です。

metacpan.org

YAMLは、アプリケーションの設定ファイルとして、2020年、広く利用されつつあるように感じています。YAMLは、コメントが書け、表現力豊かで、インデントで、配列を表現できること、「|」を使って、文字列をクォートなしで書けることが特徴的です。

YAML 1.2からは、JSONとのデータ表現の互換性が高まり、データ表現において、JSONの上位互換があるようです。

YAML::PPは、デフォルトで、YAML 1.2を解析します。

YAML 1. 2の仕様はこちら。

yaml.org

YAMLは、Perl、Python、XMLに由来があります。

YAML::PPのサンプル

use YAML::PP;
my $ypp = YAML::PP->new;
 
my $yaml = <<'EOM';
--- # Document one is a mapping
name: Tina
age: 29
favourite language: Perl
 
--- # Document two is a sequence
- plain string
- 'in single quotes'
- "in double quotes we have escapes! like \t and \n"
- | # a literal block scalar
  line1
  line2
- > # a folded block scalar
  this is all one
  single line because the
  linebreaks will be folded
EOM
 
my @documents = $ypp->load_string($yaml);
my @documents = $ypp->load_file($filename);
 
my $yaml = $ypp->dump_string($data1, $data2);
$ypp->dump_file($filename, $data1, $data2);
 
# The loader offers JSON::PP::Boolean, boolean.pm or
# perl 1/'' (currently default) for booleans
my $ypp = YAML::PP->new(boolean => 'JSON::PP');
my $ypp = YAML::PP->new(boolean => 'boolean');
my $ypp = YAML::PP->new(boolean => 'perl');
 
# Enable perl data types and objects
my $ypp = YAML::PP->new(schema => [qw/ + Perl /]);
my $yaml = $yp->dump_string($data_with_perl_objects);
 
# Legacy interface
use YAML::PP qw/ Load Dump LoadFile DumpFile /;
my @documents = Load($yaml);
my @documents = LoadFile($filename);
my @documents = LoadFile($filehandle);
my $yaml = = Dump(@documents);
DumpFile($filename, @documents);
DumpFile($filenhandle @documents);


YAML::PP はモジュール式 YAML プロセッサです。

それは、サポートすることを目指しています.http://yaml.org/を参照してください。一部の (まれ) 構文要素は、まだサポートされておらず、以下に記載されていません。YAML 1.2 YAML 1.1

YAML はシリアル化言語です。YAML 入力は「YAML ストリーム」と呼ばれます。ストリームは、1 つまたは複数の "ドキュメント" で構成され、行にドキュメントの開始マーカーが表示されます。ドキュメントの末尾は、必要に応じてドキュメント終了マーカー で終わります。---...

これにより、固定入力ファイルまたは文字列に対して連続ストリームを追加処理できます。

YAML::PP フロントエンドは現在、すべてのドキュメントをロードし、スカラーコンテキストで呼び出された場合は最初のドキュメントのみを返します。

YAML バックエンドは、YAML タグ、perl オブジェクト、データ型のカスタム処理を追加できるモジュール方式で実装されています。内部 API はまだ安定していません。提案は歓迎します。