工作中需要处理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' ??????? };