工作中需要处理INI 配置文件,看了下同事写的脚本,处理的比较简单,只解析了需要的那部分,没有对其他部分做出处理,自己重新写了一个,可以把整个文件一次处理完毕,很简单,代码如下:
use warnings;
use Data::Dumper;
my $f = 'd:/project/SDI/params.config';
my (%dict,$this);
open FILE,"$f";
while(<FILE>){
chomp;
#解释行和空白行跳过不做处理
if(/^/s*#/ or /^/s*$/){
next;
}
#将[ ]作为头做处理,如有重复将做合并处理
elsif(/^/s*/[(/w+)/]/s*$/){
if(exists $dict{$1}){
$this = $dict{$1};
}
else{
$dict{$1} = {};
$this = $dict{$1};
}
}
#定义处理,如有重复将做覆盖处理
elsif(/^/s*([^ ]+)/s*=/s*([^ ]+)/s*$/){
($param,$value) = ($1,$2); #split '=',$_;
$this->{$param}=$value;
}
#不符合INI文件定义则报错
else{
print "Line format error: $_";
}
}
print Dumper %dict;
测试文件如下:
#this is testing
[checkFileNums_123]
File_Dir=/home/users/dhu/tmp/xtff
Log_Path=./logs/checkFileNums
[checkFileDate]
File_Dir=/home/users/dhu/tmp/xtff
Log_Path=./logs/checkFileDate
上述文件运行结果如下:
$VAR1 = 'checkDoneList';
$VAR2 = {
'File_Dir' => '/home/users/dhu/tmp/xtff',
'Log_Path' => './logs/checkDoneList'
};
$VAR3 = 'checkFileDate';
$VAR4 = {
'File_Dir' => '/home/users/dhu/tmp/xtff',
'Log_Path' => './logs/checkFileDate'
};