Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Perl: перебор INI-файлов

Автор вопроса: user1300922Ответов: 3

Я делаю сценарий Perl, который должен читать и получать значения файла INI.

Формат INI-файла:

[name]
Property=value

Пример:

[switch_6500]
cpu=1.5.1.12.4
free_memory=1.45.32.16

[oracle_db_11g]
param1=value1
param2=value2
param3=value3
param4=value4
...

Как видите, секций может быть сколько угодно, содержащих любое количество параметров. Названия разделов/параметров всегда будут разными.

Что мне нужно сделать, так это заставить мой Perl-скрипт выполнить итерацию по каждому разделу и получить все имена/значения параметров этого раздела. То, что я привык делать с файлами INI, - это просто указывать имя раздела вместе с именем параметра следующим образом:

  #!/usr/bin/perl -w

  use strict;
  use warnings;
  use Config::Tiny;

  # Read the configuration file
  my $Config = Config::Tiny->new();
  $Config = Config::Tiny->read( 'configfile.ini' );
  my $Metric1_var = $Config->{switch_6500}->{cpu};
  my $Metric2_var = $Config->{switch_6500}->{free_memory};

Однако теперь, когда у меня есть неопределенное количество имен/параметров разделов, а также я не знаю их имен, я не могу найти способ извлечь все значения. Я искал модуль Config::IniFiles, и в нем есть кое-что интересное, но я не могу найти способ получить значение параметра, не зная имени раздела/параметра.

Если кто-нибудь может помочь мне с повторением этого INI-файла, я был бы очень признателен.

Спасибо.

fileconfigiterationperlini

Ответы

Ответ 1 · рейтинг 6 · Eric

Вы можете делать с Config::Tiny что хотите. Просто используйте функцию keys для перебора всех ключей хеша следующим образом:

use strict;
use Config::Tiny;

my $config = Config::Tiny->read('configfile.ini');

foreach my $section (keys %{$config}) {
    print "[$section]\n";
    foreach my $parameter (keys %{$config->{$section}}) {
        print "\t$parameter = $config->{$section}->{$parameter}\n";
    }
}

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

Ответ 2 · рейтинг 5 · Cfreak

Лично я предпочитаю Config::Simple. Вы можете вызвать метод param() без аргументов, чтобы вернуть все параметры из вашего файла. Он также имеет несколько других приятных функций по сравнению с Config::Tiny.

Ответ 3 · рейтинг 2 · tuxuday

Я так понимаю, вы довольны разбором ini-файлов. Если вы просто хотите просмотреть все разделы и их пары ключей, тогда

Вы можете перебирать Hash-Of-Hash следующим образом.

foreach my $Section (keys %$Config) {
 print "[$Section]";
 foreach my $Key (keys %{$Config->{$Section}}) {
  print "$Key = $Config->{$Section}->{$Key}";
 }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы