表示在Config :: General中包含数组引用的复杂Perl数据结构

时间:2009-09-01 05:38:14

标签: perl data-structures configuration-files

我在Perl代码中有以下数据结构:

my $config = {
    'View::Mason' => {
        comp_root     => [
            [ 'teamsite'   => 'root/teamsite' ],
            [ 'components' => 'root/components' ],
        ],
    },
};

我正在尝试在Config::General配置文件中表示此结构。

到目前为止,我有:

<View::Mason>
    <comp_root>
        teamsite        root/teamsite
    </comp_root>
    <comp_root>
        components      root/components
    </comp_root>
</View::Mason>

至少使“comp_root”元素成为数组引用,但我不能指向另一个数组引用。

可以在Config :: General中完成吗?

2 个答案:

答案 0 :(得分:4)

我认为Config :: General不可能。例如:

use Config::General qw(SaveConfigString);

my $config = {
    'View::Mason' => {
        comp_root     => [
            [ 'teamsite'   => 'root/teamsite' ],
            [ 'components' => 'root/components' ],
        ],
    },
};

print SaveConfigString($config);

产生

<View::Mason>
    comp_root   ARRAY(0x94ea168)
    comp_root   ARRAY(0x94fbc98)
</View::Mason>

如果无法保存,可能无法加载它。

这就是我要做的事情:

  1. 找出我希望我的配置文件看起来像什么。
  2. 找到一个能够加载这样的配置文件的模块。 (如果证明格式太难加载,可能会对格式进行一些更改。)
  3. 如果第2步的结果不适合我程序的其余部分直接使用,请编写一些代码将配置阅读器提供的内容转换为我的程序所需的内容。

答案 1 :(得分:1)

YAML可能是您的选择:

use strict;
use warnings;
use Data::Dumper qw(Dumper);
use YAML::XS qw(Load);

my $config_text = '
View::Mason:
  comp_root:
    -
      - teamsite
      - root/teamsite
    -
      - components
      - root/components
';

my $config = Load($yaml_text);
print Dumper($config);