Есть файл конфигурации (для кабельных модемов, но это неважно). Выглядит он примерно так: Main { /* тут всякое неинтересное */ SnmpMibObject docsDevFilterIpDefault.0 Integer 1; SnmpMibObject docsDevFilterIpSaddr.1 IPAddress 0.0.0.0; SnmpMibObject docsDevFilterIpSmask.1 IPAddress 0.0.0.0; /* ...еще несколько параметров первого объекта ACL */ SnmpMibObject docsDevFilterIpSaddr.2 IPAddress 0.0.0.0; SnmpMibObject docsDevFilterIpSmask.2 IPAddress 0.0.0.0; /* ...и еще несколько параметров второго объекта ACL */ } Хотелось бы на выходе получить что-то вроде: # ip-policy --> docsDevFilterIpDefault $config{ 'common' }{ 'ip-policy' } = 1; $config{ '1' }{ 'srcaddr' } = '0.0.0.0'; $config{ '1' }{ 'srcmask' } = '0.0.0.0'; $config{ '2' }{ 'srcaddr' } = '0.0.0.0'; $config{ '2' }{ 'srcmask' } = '0.0.0.0'; Как это сделать в лоб -- понятно. Но хочется странного, чтобы всю структуру файла описать статически, примерно так: my $matches = [ 'ip-policy' => { match => [ # этот параметр можно задать несколькими способами, # поэтому здесь массив шаблонов '^docsDevFilterIpDefault\.0$', '^mib-2\.69\.1\.6\.3\.0$', ], default => '1', function => \&cm_Integer, }, 'srcaddr' => { match => [ '^docsDevFilterIpSaddr\.(\d+)$', ], default => '0.0.0.0', function => \&cm_IPAddress, }, ]; Но есть несколько затруднений. Параметр srcaddr определяется по регэкспу '^docsDevFilterIpSaddr\.(\d+)$', и индексировать его надо по вот этому (\d+) которое в конце. А параметр ip-policy такого не имеет, и общность нарушается. Плюс еще хочется как можно меньше привязываться к ключевым словам типа match, default и т.д., и оперировать понятиями ХЕШ, МАССИВ, СКАЛЯР, ФУНКЦИЯ. Нутром чую, что где-то здесь притаилось решение в виде метапрограммы (eval), но как-то не могу сообразить как его применить. Каким образом из регэкспа '^docsDevFilterIpSaddr\.(\d+)$' выцепить $1, да еще засунуть его в инициализацию $config{ ВОТСЮДА }{} ? Есть какие-нибудь идеи?