Чтение конфигурационных файлов

Проблема

Вы хотите, чтобы пользователи вашей программы могли изменить ее поведение c помощью конфигурационного файла.

Решение

Организуйте обработку файла в тривиальном формате ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ, создавая для каждого параметра элемент хэша «ключ/значение»:
while (<CONFIG>) {
  chomp;               # Убрать перевод строки
  s/#.*//;             # Убрать комментарии
  s/^\s+//;            # Убрать начальные пропуски
  s/\s+$//;            # Убрать конечные пропуски
  next unless length;  # Что-нибудь осталось?
  my ($var, $value) = split(/\s*=\s*/, $_, 2);
  $User_Preferences{$var} = $value;
}
Существует другой более изящный вариант — интерпретировать конфигурационный файл как полноценный код Perl:
do "$ENV{HOME}/.progrc";

Комментарий

В первом решении конфигурационный файл интерпретируется в тривиальном формате следующего вида (допускаются комментарии и пустые строки):
# Сеть класса С
NETMASK = 255.255.255.0
MTU = 296
DEVICE = cua1
RATE = 115200
MODE = adaptive
После этого можно легко получить значение нужных параметров — например, $User_Preferences{"RATE"} дает значение 115200. Если вы хотите, чтобы конфигурационный файл непосредственно устанавливал значения переменных в программе вместо заполнения хэша, включите в программу следующий фрагмент:
no strict 'refs';
$$var = $value;
и переменная $RATE будет содержать значение 115200.
Во втором решении do организует непосредственное выполнение кода Perl. Если вместо блока используется выражение, do интерпретирует его как имя файла. Это практически идентично применению require, но без риска фатальных исключений. В формате второго решения конфигурационный файл принимает следующий вид:
# Сеть класса С
$NETMASK = '255.255.255.0';
$MTU   = 0x128;
$DEVICE = 'сuа1’;
$RATE   = 115_200;
$MODE  = 'adaptive';
Если вам непонятно, зачем включать в файл лишние знаки препинания, задумайтесь — в вашем распоряжении оказывается весь синтаксис Perl. Теперь простые присваивания можно дополнить логикой и проверкой условий:
if ($DEVICE =~ /1$/) {
  $RATE = 28_800;
} 
  else {
    $RATE = 115_200;
  }

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: