私のお気に入りはConfig::Stdです。複数行および複数部分の構成値を処理する方法が気に入っています。
変数が複数の値を持つ可能性がある場合は注意が必要です。構成ファイルに単一の値が存在する場合、その値はスカラーに格納されます。複数の値が存在する場合は、配列参照を取得します。
2 つの構成ファイルがあると便利だと思います。1 つは動作環境 (ライブラリの場所など) を記述する値用で、もう 1 つはユーザーが変更可能な動作用です。
また、その周りにラッパーを書くのも好きです。例 (自動生成された読み取り専用アクセサーを含むように更新):
#!/usr/bin/perl
package My::Config;
use strict; use warnings;
use Config::Std;
use FindBin qw($Bin);
use File::Spec::Functions qw( catfile );
sub new {
my $class = shift;
my ($config_file) = @_;
$config_file = catfile($Bin, 'config.ini');
read_config $config_file => my %config;
my $object = bless \%config => $class;
$object->gen_accessors(
single => {
install => [ qw( root ) ],
},
multi => {
template => [ qw( dir ) ],
},
);
return $object;
}
sub gen_accessors {
my $config = shift;
my %args = @_;
my $class = ref $config;
{
no strict 'refs';
for my $section ( keys %{ $args{single} } ) {
my @vars = @{ $args{single}->{$section} };
for my $var ( @vars ) {
*{ "${class}::${section}_${var}" } = sub {
$config->{$section}{$var};
};
}
}
for my $section ( keys %{ $args{multi} } ) {
my @vars = @{ $args{multi}->{$section} };
for my $var ( @vars ) {
*{ "${class}::${section}_${var}" } = sub {
my $val = $config->{$section}{$var};
return [ $val ] unless 'ARRAY' eq ref $val;
return $val;
}
}
}
}
return;
}
package main;
use strict; use warnings;
my $config = My::Config->new;
use Data::Dumper;
print Dumper($config->install_root, $config->template_dir);
C:\Temp> 猫 config.ini
[インストール]
ルート = c:\opt
[テンプレート]
dir = C:\opt\app\tmpl
dir = C:\opt\common\tmpl
出力:
C:\Temp> g.pl
$VAR1 = 'c:\\opt';
$VAR2 = [
'C:\\opt\\app\\tmpl',
'C:\\opt\\common\\tmpl'
];