Perl многомерные хэши

У меня есть файл конфигурации с одним из разделов, который он содержит:

[EXCLUDE_LIST]
c1=A
c2=B|C
c3=A
c1=B

У меня есть perl-скрипт, и он содержит подпрограмму, которая читает приведенный выше раздел из конфигурации и проверяет, присутствует ли в конфигурации определенная группа (cX). Входными параметрами для этого саба является хэш, привязанный (используя tie) к файлу конфигурации. Когда я отлаживал код, я пытался отобразить все содержимое раздела EXCLUDE_LIST, программа напечатала какой-то ненужный МАССИВ[memory_address] при отображении значений c1. это потому, что есть повторяющаяся запись для c1.

Мой вопрос: как мне включить логику проверки в приведенном выше подразделе, чтобы выйти из процесса, если есть какие-либо повторяющиеся записи.

вот как доступ к записям раздела конфигурации осуществляется в моем скрипте:

$cfg->{EXCLUDE_LIST}->{cX}

ТИА.


person whirlcano    schedule 11.10.2015    source источник
comment
Пожалуйста, покажите весь sub. Я не думаю, что программа напечатала ненужные значения из-за дублирования записи c1   -  person Arunesh Singh    schedule 11.10.2015
comment
Используете ли вы модуль CPAN для обработки файла конфигурации?   -  person Borodin    schedule 11.10.2015
comment
Да, Бородин, я использую модуль Config::IniFiles.   -  person whirlcano    schedule 12.10.2015


Ответы (1)


Было бы очень полезно, если бы вы сказали нам, какой модуль вы использовали для чтения вашего файла конфигурации, или если это специальное программное обеспечение (плохая идея, поскольку уже существует очень много модулей файла конфигурации), тогда вы должны показать нам код. Без этой информации этот ответ должен быть (осведомленным) предположением

Я подозреваю, что все, что вы используете для чтения файла конфигурации, обрабатывает повторяющиеся записи, сохраняя массив всех различных значений для данного ключа. В вашем случае значение $cfg->{EXCLUDE_LIST}{c1} будет ['A', 'B']

Вы можете справиться с этим, проверив, является ли хеш-значение ссылкой, например

while ( my ($key, $val) = each %{ $cfg->{EXCLUDE_LIST} } ) {

    if ( ref $val ) {
        print "$key=", join(',', @$val), "\n";
    }
    else {
        print "$key=$val\n";
    }
}

Мой вопрос: как мне включить логику проверки в приведенном выше подразделе, чтобы выйти из процесса, если есть какие-либо повторяющиеся записи.

Вы можете сделать аналогичный тест, но die, если значение является ссылкой

die qq{Multiple occurrences of "$key"} if ref $val;
person Borodin    schedule 11.10.2015
comment
спасибо Бородин. это именно то, что я реализовал сегодня на работе, и это сработало :) спасибо, что нашли время и ответили. - person whirlcano; 12.10.2015