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のコアの機能だけで実行できる
僕が考えるデメリット
  • perl形式なので当然他の言語には使えない
  • Perlのエンジニア以外には直感的で無い(と思う)

結局どれを使うの?

結論から言うと、プロダクトやプロジェクトに合ったものを選択すればいいと思う。と書くと何のためのエントリだと言う事になるので、僕の基準を書いてみようと思う。

  • Perlのみのプロダクト/プロジェクトで、エンジニアしか設定ファイルを変更しない場合はperl形式を使う
  • 他のシステムからも共通して使われる可能性がある場合は、ini/yaml形式を使う
  • 非技術者も設定ファイルを変更する可能性がある場合は、極力ini形式を使う

といったところでしょうか。当たり前のことを書いているけど、一度整理できたので良しとします。また、設定ファイルをプログラムから書き換えるといった要件が出てくれば、この限りではないです。