如何利用Perl来解析config文件

如何利用Perl来解析config文件

config文件的格式像这样(Makefile可以识别):
# version: RELEASE
#
CONFIG_CONFIG_TITLE="Platform Selection"
CONFIG_PLATFORM_altair=y
# CONFIG_PLATFORM_e500mc is not set

我想通过perl将其文件转换成perl_config文件:
$CONFIG_CONFIG_TITLE="Platform Selection";
$CONFIG_PLATFORM_altair="y";
即转换成perl可以识别的变量;

然后将perl_config文件里的所有变量导入到我需要运行的perl程序里,对变量进行进一步解析。


请问这个task可否较容易地实现?请大侠们指导。

谢谢!
可以
1.打开文件,

[Copy to clipboard] [ - ]
CODE:
open my $file,"<","config" or die "Fail to open $!";

2.忽略注释行

[Copy to clipboard] [ - ]
CODE:
while ( <$file>){
  next if /^#/;
do_your_work_here;
}

3.对于非注释行,干两件事情
变量前面添加$

[Copy to clipboard] [ - ]
CODE:
s/^(?!\$)/\$/;

如果=后的变量没有"",则加上"",但是$a=$b这样的形式例外

[Copy to clipboard] [ - ]
CODE:
s/=([^"\$]*?)(\n)?$/="$1"$2/;

用 Hash,别用变量,说过八百遍了。
或者用现成的模块,cpan上搜Config::General
Config::Simple

挺好用的
谢谢楼上各位大侠。
如何用HASH替代变量的使用?
用模块的话,可以保证其移植性吗,我的意思是在不同的linux平台都可以
用行吗?


QUOTE:
原帖由 afeiguo 于 2008-6-4 18:47 发表
config文件的格式像这样(Makefile可以识别):
# version: RELEASE
#
CONFIG_CONFIG_TITLE="Platform Selection"
CONFIG_PLATFORM_altair=y
# CONFIG_PLATFORM_e500mc is not set

我想通过perl将其文件 ...

最直接的方法读出变量的值是:

[Copy to clipboard] [ - ]
CODE:
my ($CONFIG_CONFIG_TITLE,$CONFIG_PLATFORM_altair);
my $config_file = "perl_config.seq";
open(CONFIGFILE, "<", $config_file) or die("Cannot open config file: $config_file.\n");
while(my $line = <CONFIGFILE>){eval($line);}
close(CONFIGFILE);

#!/usr/bin/perl


use strict;
use warnings;

open (CONFIG_FILE, "config") || die ("Could not open file");

while(<CONFIG_FILE>){
     chomp;
     my %result = my ($keys,$values) = split("=", $_);
     print "\$result{$keys} = $result{$keys}\n";

}


QUOTE:
原帖由 flw 于 2008-6-4 19:08 发表
用 Hash,别用变量,说过八百遍了。

他们吃了亏才会想到听你的劝告,在这之前的警告,貌似没大用!
看到总是有人问这问题,我也来回一帖:

#!/usr/bin/perl



use strict;
use warnings;

open (CONFIG_FILE, "config") || die ("Could not open file");

while(<CONFIG_FILE>){
     chomp;                  # no newline

       s/#.*//;                # no comments

       s/^\s+//;               # no leading white

       s/\s+$//;               # no trailing white

       next unless length;     # anything left?

     my %result = my ($keys,$values) = split(/\s*=\s*/, $_, 2);
     print "\$result{$keys} = $result{$keys}\n";

}