揮発性のメモ2

http://d.hatena.ne.jp/iww/

Config::Simpleのバグ?

Config::Simple 4.59 では、ハッシュが空っぽの状態からは 新たに変数を追加できない。

#!/usr/bin/perl

use strict; use warnings;
use diagnostics;
use Config::Simple '-strict';

my $cfg = new Config::Simple;

$cfg->read('/tmp/test.conf');  #★ここで空のファイルを読み込む
$cfg->param( "ABC", "aaa" );   #★ここでエラー
$cfg->write('/tmp/test.conf');
$ ./a.pl
Uncaught exception from user code:
        '_SYNTAX' is not defined at /usr/share/perl5/Config/Simple.pm line 530.
 at /usr/share/perl5/Config/Simple.pm line 530
        Config::Simple::set_param('Config::Simple=HASH(0x2e458)', 'ABC', 'aaa') called at /usr/share/perl5/Config/Simple.pm line 441
        Config::Simple::param('Config::Simple=HASH(0x2e458)', 'ABC', 'aaa') called at ./a.pl line 9


ソース
Config::Simple は実はini形式以外にも2,3つくらいフォーマットが選べる。
でも、なんの形式で保存するか決めないといけないので、普通にnewするときは引数で文法(syntax)を指定する必要がある。
readするときは自動で文法を判定するので、通常は指定し忘れてても問題はないが、ファイルが空っぽだとやっぱり文法をど忘れする。

use Config::Simple '-strict';

my $cfg = new Config::Simple(syntax=>'ini');

$cfg->read('/tmp/test.conf');  

$cfg->syntax("ini");               #★文法を指定する
$cfg->{_SUB_SYNTAX}="simple-ini";  #  [default] を出力しないおまじない

$cfg->param( "ABC", "aaa" );   
$cfg->write('/tmp/test.conf');

文法の指定はsyntax()であとからでも設定できるが、変更すると保存時に別のエラーになるので実質無意味っぽい