(
点此下载)在配置脚本的时候,经常需要读入一些参数,为了方便起见有时会把参数整理成参数文件。当这些参数是平行关系的时候,只需要按行读入即可;但是更一般的情况是,如果这些参数存在层次的关系,该怎么读入呢?
比方说,我要写一个带界面的数据库查询工具,该工具的界面大小由初始化参数决定,数据库的连接参数也写入在参数文件中。这样就存在了两类截然不相同类型的数据,最好将它们区分开来。具体形式如下:
size^
x^
500
$
y^
500
$
$
db^
name^
tj
$
host^
localhost
$
port^
5432
$
id^
postgres
$
pwd^
7697
$
$
以上数据存成tj.param文件,再把它整成一个hash表,这样我要取数据库的端口的话就可以用“$param{'db'}->{'port'}->{'val'}”。
脚本如下:
sub getparam{
my $param = shift;
my @tmp = ();
my $tmp = '';
push @tmp, $param ;
open PAR, 'tj.para' ;
while (<PAR>) {
s/^(\s+)([^\s]*)(\s+)$/$2/;
chomp;
if ($_ ne '') {
s/\^// and do {
my %tmp = ();
$tmp[length(@tmp) - 1]->{"$_"} = \%tmp;
push @tmp, \%tmp ;
next;
};
s/\$// and do {
if (@tmp>0) {
pop @tmp;
} else {
print "logic error: stack has been empty.\n";
return 0;
}
next;
};
$tmp[length(@tmp) - 1]->{"val"} = $_;
}
}
close PAR;
if (length(@tmp) != 0) { return 0; }
else {return 1;}
}
1;
存成tjpar.pl,测试一下看看:
use strict;
require('tjpar.pl');
my %param = ();
getparam(\%param);
print $param{'db'}->{'port'}->{'val'};
会打印出来5432,就成功了;-)