【Perl】いろいろな形式で設定ファイルを読む


外部から設定ファイルを読み込む方法はいろいろあるが、一番お手軽なのは Config::Any モジュールを使うことだ。このモジュールを使うと様々な形式のファイルを一つの命令で読むことが出来る。

コード例

load_stems メソッド

基本は、これを使っておけば間違いない。stems オプションに指定した文字列に、対応した拡張子を自動的に補ってファイルを探してくれる。

#!/usr/bin/perl
use strict;
use warnings;
use Config::Any;
use YAML::Syck;

my $cfg = Config::Any->load_stems( {
    stems => [qw! config !],
    use_ext => 1,
    flatten_to_hash => 1,
} );

print Dump $cfg;

load_files メソッド

読み込むファイルを指定したいときはこれ。files オプションには複数のファイル名を指定でき、その中で存在するファイルだけが読み込まれる。

my $cfg = Config::Any->load_files( {
    files => [qw!
        config.json
        config.yml
    !],
    use_ext => 1,
    flatten_to_hash => 1,
} );

出力例

---
config.json:
  data1: VALUE1
  data2:
    data20: VALUE20
    data21:
      - VALUE21
      - VALUE22
config.yml:
  data1: VALUE1
  data2:
    data20: VALUE20
    data21:
      - VALUE21
      - VALUE22

設定ファイルの例

標準では以下の6つの形式に対応している。INI 形式を除いて、全て同じ内容を表している。

Apache 形式(拡張子 .cnf.conf

data1 VALUE1
<data2>
    data20 VALUE20
    data21 VALUE21
    data21 VALUE22
</data2>

INI 形式(拡張子 .ini

この形式では配列を使うことが出来ない。以下の例で言えば、4 行目の設定は 5 行目で上書きされてしまう。

data1=VALUE1
[data2]
data20=VALUE20
data21=VALUE21
data21=VALUE22

JSON 形式(拡張子 .jsn.json

{
    "data1": "VALUE1"
    ,"data2": {
        "data20": "VALUE20"
        ,"data21": [
            "VALUE21"
            ,"VALUE22"
        ]
    }
}

Perl 形式(拡張子 .pl.perl

{
    data1 => "VALUE1",
    data2 => {
        data20 => "VALUE20",
        data21 => [qw!
            VALUE21
            VALUE22
        !],
    },
};

XML 形式(拡張子 .xml

<?xml version="1.0"?>
<config>
    <data1>VALUE1</data1>
    <data2>
        <data20>VALUE20</data20>
        <data21>VALUE21</data21>
        <data21>VALUE22</data21>
    </data2>
</config>

YAML 形式(拡張子 .yml.yaml

---
data1: "VALUE1"
data2:
    data20: "VALUE20"
    data21:
        - "VALUE21"
        - "VALUE22"

コメントを残す