免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6929 | 回复: 18
打印 上一主题 下一主题

如何利用Perl来解析config文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-04 18:47 |只看该作者 |倒序浏览
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可否较容易地实现?请大侠们指导。

谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-06-04 18:52 |只看该作者
可以
1.打开文件,

  1. open my $file,"<","config" or die "Fail to open $!";
复制代码

2.忽略注释行

  1. while ( <$file>){
  2.   next if /^#/;
  3. do_your_work_here;
  4. }
复制代码

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

  1. s/^(?!\$)/\$/;
复制代码

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

  1. s/=([^"\$]*?)(\n)?$/="$1"$2/;
复制代码

[ 本帖最后由 churchmice 于 2008-6-4 19:01 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-06-04 19:08 |只看该作者
用 Hash,别用变量,说过八百遍了。

论坛徽章:
0
4 [报告]
发表于 2008-06-04 21:50 |只看该作者
或者用现成的模块,cpan上搜Config::General

论坛徽章:
0
5 [报告]
发表于 2008-06-04 22:08 |只看该作者
Config::Simple

挺好用的

论坛徽章:
0
6 [报告]
发表于 2008-06-04 22:16 |只看该作者

回复 #5 cobrawgl 的帖子

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

论坛徽章:
0
7 [报告]
发表于 2008-06-07 15:20 |只看该作者
原帖由 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将其文件 ...

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

  1. my ($CONFIG_CONFIG_TITLE,$CONFIG_PLATFORM_altair);
  2. my $config_file = "perl_config.seq";
  3. open(CONFIGFILE, "<", $config_file) or die("Cannot open config file: $config_file.\n");
  4. while(my $line = <CONFIGFILE>){eval($line);}
  5. close(CONFIGFILE);
复制代码

论坛徽章:
0
8 [报告]
发表于 2008-06-07 20:25 |只看该作者
#!/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";

}

论坛徽章:
0
9 [报告]
发表于 2008-06-09 09:59 |只看该作者
原帖由 flw 于 2008-6-4 19:08 发表
用 Hash,别用变量,说过八百遍了。


他们吃了亏才会想到听你的劝告,在这之前的警告,貌似没大用!

论坛徽章:
0
10 [报告]
发表于 2008-06-10 09:10 |只看该作者
看到总是有人问这问题,我也来回一帖:

#!/usr/bin/perl



use strict;
use warnings;

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

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

&nbsp;&nbsp;&nbsp;&nbsp;   s/#.*//;                # no comments

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

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

&nbsp;&nbsp;&nbsp;&nbsp;   next unless length;     # anything left?

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

}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP