首页 > 解决方案 > 如何使用 Perl 的 Config::Simple 从配置文件中获取值?

问题描述

我正在尝试在 perl 脚本中执行 shell 脚本。如果我手动分配变量,我可以执行 shell 脚本。但我想在配置文件中的脚本之外调用变量。

如何执行脚本?以下是我的示例命令。

my $confdir = $ENV{CFG_DIR};  ## Directory where configuration file resides 
my $configfile = 'LED.cfg';   ## Configuration file
my $LEDcfg = new Config::Simple( filename => "$confdir/$conffile" ); ## assigning the configuration file to LEDcfg file
my $ApID = $LEDcfg->param(".ApID") ## passing the parameter ApID from configuration file 
chomp ${ApID};
my $pwd = `(ApID=$ApID $path/CA.sh)`; ## running shell script by ApID parameterized => Failed
my $pwd = `(ApID=ACF_ERTF_DER $path/CA.sh)`; ## running shell script by ApID hardcoded => Succeeded

第 7 行中提到的值ApID=ACF_ERTF_DER。这个值是从我调用的不同配置文件中调用的$CFG_DIR/LED.cfg

如果我评论my $ApID(第 4 行)和my $pwd(第 6 行),则作业会通过使用最后一行 7 ie 直接调用 ApID 来成功my $pwd = (ApID=ACF_ERTF_DER $path/CA.sh);

我正在调用ApID来自LED.cfg文件以从 shell 脚本中检索密码并连接到服务器。如果我手动运行 shell 脚本,我会得到用于连接服务器的密码。

标签: perl

解决方案


看起来您的问题是您没有读取配置文件,也许这就是您没有得到任何值的原因。

编程的诀窍是知道你在每一步都处于良好的预期状态。回到您的程序并查看每个步骤以检查您想要发生的事情是否确实发生了。我怀疑您的问题在此过程中很早就发生了,然后没有其他方法可以解决。

您有文件名$configfile,但随后使用$conffile

my $confdir = $ENV{CFG_DIR};  
my $configfile = 'LED.cfg'; 
my $LEDcfg = new Config::Simple( filename => "$confdir/$conffile" );

然后,在那之后,您无需执行任何操作来检查您是否拥有有效的配置。

从 using 开始strict,这会强制您声明变量,以便捕获那些使用错误名称的讨厌实例。然后,一旦你构建了路径,看看它是否真的存在:

use strict;
use warnings;

use File::Spec::Functions;

my $conf_dir = ...;
my $conf_file = ...;

my $conf_path = catfile( $conf_dir, $conf_file );
die "Config path <$conf_path> does not exist!" unless -e $conf_path;

一旦你知道你有一个现有的文件。请注意,您必须正确调用该方法。第一个参数是路径,而不是filename. 您还可以检查您是否得到了预期的结果:

my $config = Config::Simple->new( $conf_path );
my %vars = $config->vars;

use Data::Dumper;
print "Found config: ", Dumper( \%vars );

此外,您说您想获取 的值ApID,然后尝试访问.ApID. 也许这是对的,但它看起来很可疑,而且您还没有向我们展示示例配置文件。您可能会在那里添加更多调试输出以检查您是否获得了值。

一旦你整理了那部分,你就可以继续剩下的了。但是,还要注意 Config::Simple 是 15 岁。有许多更好的、当前受支持的模块可以帮助您。


推荐阅读