ディレクトリツリーを使った設定ファイル管理・その 1

ディレクトリツリーを使った設定ファイル管理・その 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 の危険もあるし、必要なことだけ渡す関数作ってそれ経由でアクセスでしょうな。

See Also

Copyright © 髭。/ Hugo + hugo-book