ディレクトリツリーを使った設定ファイル管理・その 1 #
会社で相談を受けた。その場での結論としては「まぁ、どうにでもなるよね」って事だったんだが、せっかくなので書き残しておく。
例えば、こんな構造だとする。
/path/to/config/
app00/
license.txt
id.txt
app01/
license.txt
id.txt
で、こういう設定情報を一括でパッと取得したり、パッと更新したりしたいわけだ。らくちんな方法はないかな、と思ってちょっと考えて、File::Slurp::Tree を使ってみた
use File::Slurp::Tree;
use Data::Dumper;
my $tree = slurp_tree('/path/to/config');
print Dumper $tree;
実行結果
$VAR1 = {
'path' => {
'to' => {
'config' => {
'app00' => {
'id.txt' => '10',
'license.txt' => '1'
},
'app01' => {
'id.txt' => '0',
'license.txt' => '0'
}
}
}
}
};
/path/to/config/app00/license.txt の内容が欲しければ、
$tree->{path}->{to}->{config}->{app00}->{'license.txt'};
とかでアクセスすればいい。
保存する時は
$tree->{path}->{to}->{config}->{app00}->{'license.txt'} = 100;
spew_tree('/path2', $tree);
とかすると /path2/path/to/…. に全部保存してくれる。ディレクトリが存在いない時は勝手に作る。指定したディレクトリ以下に作ることに注意。上書きしたい時は
spew_tree('/', $tree);
とかする。/path/to/config とすると、/path/to/config/path/to/config/… となるよ。
で、$tree をそのまま上書きすると、値を変えている/いないにかかわらず全部のファイルが更新されるので、それが嫌な場合は、
$tree_new->{path}->{to}->{config}->{app00}->{'license.txt'} = $tree->{path}->{to}->{config}->{app00}->{'license.txt'} + 10;
spew_tree('/',$tree_new);
とかするとよい。ディレクトリ構造がそのまま HASH の構造になっているのでらくちん。
それから、当たり前のことではあるが、「license.txt には数字しか入ってないし」とか考えて改行コード除去するの忘れたりしないこと。
まぁ、実際に使うとしたら、ディレクトリ階層全部手入力する必要もないだろうし、typo の危険もあるし、必要なことだけ渡す関数作ってそれ経由でアクセスでしょうな。