perl - 如何使用 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 脚本,我会得到用于连接服务器的密码。
解决方案
看起来您的问题是您没有读取配置文件,也许这就是您没有得到任何值的原因。
编程的诀窍是知道你在每一步都处于良好的预期状态。回到您的程序并查看每个步骤以检查您想要发生的事情是否确实发生了。我怀疑您的问题在此过程中很早就发生了,然后没有其他方法可以解决。
您有文件名$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 岁。有许多更好的、当前受支持的模块可以帮助您。
推荐阅读
- javascript - Mulitdatepicker - 从数组中设置的日期中删除 .ui-state-highlight
- xml - 来自数组响应的 Oracle 12c PLSQL SOAP EXTRACTVALUE
- awk - 仅在下一列中更改与另一个模式匹配的模式
- utf-8 - Mulesoft SFTP 使用 BOM 写入 UTF-8 编码的 .csv 文件
- node.js - nodemailer SMTP 服务器连接问题(错误:连接 ETIMEDOUT)但它适用于不在我的另一个系统
- ios - 1.有没有办法在ios中收集双卡运营商信息(物理+ esim)?
- php - 将数据从小部件搜索传输到 SEO 工具 我正在使用我的网站
- episerver - 如何在 EPiServer 中自定义 linkItemCollection 的默认视图
- flutter - Flutter 错误 - 任务“:permission_handler:lint”执行失败
- yaml - OpenApi 3.0:如何根据用作该数组元素模式的对象中的键(属性)来定义数组元素的唯一性?