11 февр. 2009 г.

Парсинг конфиг-файлов (.conf, .cnf)

Цель:

Нужен был perl-скрипт парсинга конф-файлов (.conf) без загрузки дополнительный модулей.


Дано:

Конфигурационный файл progname.conf, следующего содержания:

[PART1]
#Раздел первый
# Кратко опишем раздел этим комментарием
var1=value1 # Параметр и значение без разделителей
var2 = value2 # Параметр и значение разделитель пробел
var3 = value3 # Параметр и значение разделитель tab

[Part2]
# Раздел второй
# Кратко опишем раздел этим комментарием
var1 = "value 1 1 1" # строка значения в кавычках
var2 = value 2 2 two # строка значения без кавычек


Решение:

Решение не моё, нагугленное и немного подправленное под собственные нужды.

Создадим файл progname.pl
#touch ./progname.pl
#chmod a+x ./progname.pl


Вписываем следующие строки в него:

#!/usr/bin/perl
use strict;

sub ReadConfig {
my $file=shift;
die "Config not found" unless(-e $file);
my %config;
my $key;
open(CONF,"<",$file) || die "can't open config file: $!";
while() {
chomp;
~s/^[\ \t]+//;
next if /^#|^$/;
$key=$1 if /^\[(\w+)\]/;
if($key) {
next if /^\[/;
my($var,$value)=split(/=/,$_);
$var=~s/^[\t \ ]+|[\t \ ]+$//;
$value=~s/^[\t \ ]+|[\t \ ]+$//;
$value=~s/[\ \t]*#(.+)$//;
$value=$1 if /"(.+)"/g;
$config{uc($key)}{uc($var)}=$value;
}
}
return %config;
}


my %config=ReadConfig('./progname.conf');

foreach my $cnf (sort keys %config) {
print "[".$cnf."]\n";
foreach my $cnfv (sort keys %{$config{$cnf}}) {
print "\t".$cnfv."=".$config{$cnf}{$cnfv}."\n";
}
}


Примечание: Возможно не учтены многие моменты конфиг-файлов, но заданным требованиям отвечал вполне.

1 комментарий: