设为首页加入收藏诚征代理商 
人才网-提供最新的人才网信息,人才信息查询,人才网招聘服务


将参数文件转化为hash表的脚本

128人才网(www.job128.com.cn) IT技术论坛
在配置脚本的时候,经常需要读入一些参数,为了方便起见有时会把参数整理成参数文件。当这些参数是平行关系的时候,只需要按行读入即可;但是更一般的情况是,如果这些参数存在层次的关系,该怎么读入呢?
比方说,我要写一个带界面的数据库查询工具,该工具的界面大小由初始化参数决定,数据库的连接参数也写入在参数文件中。这样就存在了两类截然不相同类型的数据,最好将它们区分开来。具体形式如下:
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,就成功了;-)


人才网http://www.job128.com 信息部