Представление сложной структуры данных Perl, содержащей ссылки на массивы в Config :: General - PullRequest
1 голос
/ 01 сентября 2009

У меня есть следующая структура данных в коде 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 ]

4 голосов
/ 01 сентября 2009

Я не верю, что это возможно с 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 голос
/ 01 сентября 2009

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);
...