Perlにおける設定ファイルを自分なりに比較してみた
Twitterで10日くらい前に、Perlから設定ファイルを扱う際に、どの形式を使うのがいいんだろう?みたいな感じなつぶやきをしていたら、フォロワーの方からリプライが付いたので、メジャーな設定ファイル(と思われる)をそれぞれ自分なりに比較検討してみたのでそのまとめ。
以下の3つの形式を比較検討。
ini/yaml形式のサンプルコードでは、CPANモジュールを使っているが、モジュールの選択基準はあまりなく、とりあえず仕様が小さそうくらいな感じのを選択。今回はあくまで設定ファイルに特化したいと考えている。
ini形式
Windowsでも割と一般的に見かける形式。mysqlの設定ファイルもこの形式。
設定ファイル例
% cat data.ini [site1] url = http://d.hatena.ne.jp/amari3 title = amari3のはてなダイアリー author = amari3 [site2] url = http://amari3.hatenablog.jp title = amari3の日記 author = amari3
設定ファイル読み込み例
use strict; use warnings; use feature qw( say ); use Config::Tiny; use Data::Dumper; my $conf_file = 'data.ini'; my $c = Config::Tiny->new->read($conf_file); say Dumper($c); say $c->{site1}->{title};
実行結果
$VAR1 = bless( { 'site2' => { 'url' => 'http://amari3.hatenablog.jp', 'author' => 'amari3', 'title' => 'amari3の日記' }, 'site1' => { 'url' => 'http://d.hatena.ne.jp/amari3', 'author' => 'amari3', 'title' => 'amari3のはてなダイアリー' } }, 'Config::Tiny' ); amari3のはてなダイアリー
ini形式のサンプルでは、Config::Tinyオブジェクトになっているが、値へのアクセスはハッシュのリファレンスで普通にアクセスできる。
僕が考えるメリット
- 設定ファイル自体がシンプルでわかりやすい
- おそらく誰でも直感的に編集できる
- 言語に基本的には依存しない
僕が考えるデメリット
- セクションのネストができない
- ↑により凝ったことをするのが難しい
yaml形式
有名なところでは、Pitで使われている形式。
設定ファイル例
% cat data.yaml site1: url: http://d.hatena.ne.jp/amari3 title: amari3のはてなダイアリー author: amari3 site2: url: http://amari3.hatenablog.jp title: amari3の日記 author: amari3
設定ファイル読み込み例
use strict; use warnings; use feature qw( say ); use YAML::Syck; use Data::Dumper; my $conf_file = 'data.yaml'; my $c = YAML::Syck::LoadFile($conf_file); say Dumper($c); say $c->{site1}->{title};
実行結果
$VAR1 = { 'site2' => { 'url' => 'http://amari3.hatenablog.jp', 'author' => 'amari3', 'title' => 'amari3の日記' }, 'site1' => { 'url' => 'http://d.hatena.ne.jp/amari3', 'author' => 'amari3', 'title' => 'amari3のはてなダイアリー' } }; amari3のはてなダイアリー
ハッシュリファレンスが返ってくるので、特に難しいところは無いと思う。
僕が考えるメリット
- 配列とハッシュのネストができる
- ↑により凝った設定ができる
- 言語に基本的には依存しない
僕が考えるデメリット
- ちゃんと使いこなそうとすると覚えることが多い
perl形式
設定ファイル自体もPerlで書いてしまう。
設定ファイル例
% cat data.perl { site1 => { url => 'http://d.hatena.ne.jp/amari3', title => 'amari3のはてなダイアリー', author => 'amari3', }, site2 => { url => 'http://amari3.hatenablog.jp', title => 'amari3の日記', author => 'amari3', }, }
設定ファイル読み込み例
use strict; use warnings; use feature qw( say ); use Data::Dumper; my $conf_file = 'data.perl'; my $c = do $conf_file or die "$!$@"; say Dumper($c); say $c->{site1}->{title};
実行結果
$VAR1 = { 'site2' => { 'url' => 'http://amari3.hatenablog.jp', 'author' => 'amari3', 'title' => 'amari3の日記' }, 'site1' => { 'url' => 'http://d.hatena.ne.jp/amari3', 'author' => 'amari3', 'title' => 'amari3のはてなダイアリー' } }; amari3のはてなダイアリー
yaml形式と同様、ハッシュリファレンスなので、特に難しいところは無いと思う。
結局どれを使うの?
結論から言うと、プロダクトやプロジェクトに合ったものを選択すればいいと思う。と書くと何のためのエントリだと言う事になるので、僕の基準を書いてみようと思う。
- Perlのみのプロダクト/プロジェクトで、エンジニアしか設定ファイルを変更しない場合はperl形式を使う
- 他のシステムからも共通して使われる可能性がある場合は、ini/yaml形式を使う
- 非技術者も設定ファイルを変更する可能性がある場合は、極力ini形式を使う
といったところでしょうか。当たり前のことを書いているけど、一度整理できたので良しとします。また、設定ファイルをプログラムから書き換えるといった要件が出てくれば、この限りではないです。