我正在尝试找出最佳逻辑来确定我的脚本用户是否在配置文件中启用了多个SQL选项,原因只有一个支持。
我的第一个想法是使用一个设置为0,1,2,3的简单变量,然后由脚本读取以运行正确的子例程。然后我开始考虑是否通过配置文件中是否存在该部分来完成它的方式,可以使用我正在使用的模块。但我现在遇到的问题是,如果我根据某个配置部分的存在确定使用哪个SQL软件并不意味着我必须有逻辑说明是否存在“this”部分和“that”部分然后出错?但那意味着我会考虑所有相关部分的所有组合。正确?
这是我做这件事的第一种方式吗?还是有更好的方法?
我已经包含了我的配置文件的样本和未完成的子程序,逻辑将被包含在内。我将通过在配置文件中注释它们来控制部分的存在。顺便说一下,我在Perl中编写,我使用Config::IniFiles来读取和写入INI文件。
任何想法都会非常感激。
sub sql_option {
if (config_file()->SectionExists('SQLite')) {
sqlite_setup();
} elsif (config_file()->SectionExists('MySQL')) {
mysql_setup();
} elsif (config_file()->SectionExists('PgSQL')) {
pgsql_setup();
} elsif (config_file()->SectionExists('MSSQL')) {
mssql_setup();
} else {
print color 'red';
print "No SQL server option defined!\n";
print color 'reset';
print "\n";
die "Script halted!\n";
}
}
和INI文件:
[ESX]
host=esxi01.solignis.local
;port=
user=root
password=
[SQLite]
db=discovery.db
[MySQL]
host=sql01.solignis.local
;port=
user=root
password=
;[PgSQL]
;host=
;port=
;user=
;password=
;[MSSQL]
;host=
;port=
;user=
;password=
答案 0 :(得分:2)
这是一种方法:
my %sql_setup_functions = (
SQLite => \&sqlite_setup,
MySQL => \&mysql_setup,
PgSQL => \&pgsql_setup,
MSSQL => \&mssql_setup,
);
sub sql_option
{
my @engines = grep {
config_file()->SectionExists($_)
} keys %sql_setup_functions;
unless (@engines == 1) {
print color 'red';
if (@engines) {
print "Multiple SQL server options defined!\n";
print " $_\n" for sort @engines;
} else {
print "No SQL server option defined!\n";
}
print color 'reset';
print "\n";
die "Script halted!\n";
} # end unless exactly 1 SQL engine
# Call the setup function for the selected engine:
$sql_setup_functions{$engines[0]}->();
} # end sql_option