请教大家了!看看大家有没有什么好的方法解析这种ini文件

请教大家了!看看大家有没有什么好的方法解析这种ini文件

# 数据源定义部分
[DSN]
DATASOURCE = aaaa
USERNAME = bbb
PASSWORD = ccc

# 源表与目标表对应关系,格式为:源表名->目标表名:目标表中的时间字段
[MAP]
source_table1->target_table1:field1
source_table2->target_table2:field2
.
.
.
.
.
.


上面是文件的内容,.号表示还有多行,我省略了
[MAP]段会有很多行,我没全写
目标:通过Perl程序解析这个ini文件,把[DSN]段中的DATASOUCE、USERNAME和PASSWORD部分的值都赋值给程序中的变量$datasource、$username和$password,即处理完后
$datasource='aaaa'
$username='bbb'
$password='ccc'
[MAP]段中的内容要迭代的赋值给程序中的$source_table、$target_table和$field变量,每迭代一次,处理相应的逻辑,即[MAP]段中的每一行都要赋值给对应的$source_table、$target_table和$field变量

谢谢,请大家帮忙,提供一下好的思路!

use Config::IniFiles;
我自己写了一段代码,经测试好用,大家帮忙看看还有改进的余地吗?

下面的数据文件
C:\parse>type config.ini
# 88888888
[DSN]
DATASOURCE=aaa
USERNAME=zhouhaiming
PASSWORD=123456

#天安门
[MAP]
source1->target1
source2->target_abc

下面的是代码
#!/usr/bin/perl


use strict;

my $data_file = 'c:\parse\config.ini';

open (FH,$data_file) or
    die "ERR: Cannot open data file: $!\n";

my $paragraph_flag;
my $dsn;
my $map;

my $shift_paragraph_flag = 0; # 数据段切换标记,表示由DSN段切换到MAP段了


my ($source_table, $target_table);

while (<FH>) {
  chomp();
  next if(($_=~ /^\s*$/) || ($_=~ /^#/)); # 跳过空行和注释行

    
  if(/^\s*\[\s*(DSN)\s*\]\s*$/i)
  {
    $dsn = {};
    $paragraph_flag = 'dsn_paragraph';
  }
  
  if(/^\s*\[\s*MAP\s*\]\s*$/i)
  {
    $map = {};
    $paragraph_flag = 'map_paragraph';
    $shift_paragraph_flag = 1;
  }
  
  if($shift_paragraph_flag)
  {
    print "数据源名是:$dsn->{'DATASOURCE'}\n";
    print "用户名是:$dsn->{'USERNAME'}\n";
    print "用户密码是:$dsn->{'PASSWORD'}\n";
    print "\n";
    $shift_paragraph_flag = 0;
  }
  
  if($paragraph_flag eq 'dsn_paragraph')
  {
    if(/^\s*DATASOURCE\s*=\s*(\w+)\s*$/i)
    {
      $dsn->{'DATASOURCE'} = $1;
    }
    elsif(/^\s*USERNAME\s*=\s*(\w+)\s*$/i)
    {
      $dsn->{'USERNAME'} = $1;
    }
    elsif(/^\s*PASSWORD\s*=\s*(\w+)\s*$/i)
    {
      $dsn->{'PASSWORD'} = $1;
    }
  }
  
  if($paragraph_flag eq 'map_paragraph')
  {
    ($source_table, $target_table) = $_ =~ /^\s*(\w+)\s*->\s*(\w+)\s*$/;
    printf("%-30s%-30s\n", $source_table, $target_table);
  }
}

close(FH);


有点小缺陷,\w元字符匹配a-zA-Z_-0-9,其实我不想匹配减号-,Perl元字符中有只匹配a-zA-Z_0-9的吗?

哪位朋友有更简练的方法吗?帮吗改进一下,先谢谢了!我Perl语法不熟悉,硬做的,写的代码有点像开发c,努力向Perl风格靠拢!



QUOTE:
原帖由 zhouhaiming 于 2007-9-6 10:04 发表
有点小缺陷,\w元字符匹配a-zA-Z_-0-9,其实我不想匹配减号-,Perl元字符中有只匹配a-zA-Z_0-9的吗?

自己写
自己写?能自己预先定义元字符吗?如果能的话怎么定义啊?

我可不想每次匹配时都写a-zA-Z_0-9,得累死! 我也懒
try

[Copy to clipboard] [ - ]
CODE:
my $meta = 'a-zA-Z_0-9';
$str =~ /[$meta]+/;

推荐一下偶用过的方法。
http://blog.chinaunix.net/u/29291/showart_344126.html
推荐一下偶用过的方法。
http://blog.chinaunix.net/u/29291/showart_344126.html
推荐一下偶用过的方法。
http://blog.chinaunix.net/u/29291/showart_344126.html