Perl调用和管理外部文件中的变量(如软件和数据库配置文件)
2020-09-02 本文已影响0人
生物信息与育种
编写流程时,有一个好的习惯是将流程需要调用的软件、数据库等信息与脚本进行分离,这样可以统一管理流程的软件和数据库等信息,当它们路径改变或者升级的时候管理起来就很方便,而不需要去脚本中一个个寻找再修改。
在shell编程中,我们可以通过source config.txt
来获取配置文件config.txt中的变量。在Perl中,我们可以将这个功能编写为一个模块,以后就都可以拿来直接用了。
假设配置文件config.txt
如下:
###########################
#######software path#######
###########################
codeml=/share/project002/bin/paml44/bin/codeml
formatdb=/opt/blc/genome/bin/formatdb
blastall=/opt/blc/genome/bin/blastall
muscle=/opt/blc/genome/bin/muscle
###########################
#######database path#######
###########################
go=/opt/blc/genome/go.fa
kegg=/opt/blc/genome/kegg.fa
针对配置文件,我们可以写一个名为Soft.pm
的模块:
################################################
######This package contains the pathes of softwares and database
######You can modify the config.txt when the path changed
################################################
package Soft;
use strict;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(parse_config);
##parse the software.config file, and check the existence of each software
################################################
sub parse_config{
my ($config,$soft)=@_;
open IN,$config || die;
my %ha;
while(<IN>){
chomp;
next if /^#|^$/;
s/\s+//g;
my @p=split/=/,$_;
$ha{$p[0]}=$p[1];
}
close IN;
if(exists $ha{$soft}){
if(-e $ha{$soft}){
return $ha{$soft};
}else{
die "\nConfig Error: $soft wrong path in $config\n";
}
}else{
die "\nConfig Error: $soft not set in $config\n";
}
}
1;
__END__
保存后,在Perl脚本中即可使用该模块:
#! /usr/bin/perl -w
use strict;
use FindBin qw($Bin $Script);
use lib $Bin;
use Soft; #调用模块
......
my $config="$Bin/config.txt";
my $blastall=parse_config($config,"blastall");
......
以上是使用相对路径,如果是用绝对路径,如下:
#! /usr/bin/perl -w
use strict;
use lib '/path/soft/';
use Soft;
......
my $config="/path/soft/config.txt";
my $blastall=parse_config($config,"blastall");
......
Ref:https://blog.csdn.net/hugolee123/article/details/38647011