我正在尝试使用模块的 tie 功能配置::Ini文件 http://search.cpan.org/~shlomif/Config-IniFiles-2.65/lib/Config/IniFiles.pm但我不知道如何引用子例程内部的哈希。如果我从子例程中删除 tie 函数和相关代码,它就可以正常工作。
这是我认为可行的行,但告诉我“$cfg”未初始化。
use Config::IniFiles
sub config_file {
my $cfg_file = 'settings.ini';
my %cfg;
tie %cfg, 'Config::IniFiles', ( -file => "$cfg_file" );
#my $cfg = Config::IniFiles->new( -file => $cfg_file );
}
sub esx_host_check {
my $esx_host = config_file()->$cfg{ESX}{host};
}
我确信这很简单,但我很困惑。
首先,tie
函数返回代表关联的内部隐藏对象,而不是关联变量本身。其次,您不能从子例程返回复数绑定值(散列或数组)并让它按照您期望的方式工作。您需要返回对复数值的引用,然后在需要使用它时取消引用它。
use Config::IniFiles;
sub config_file {
tie my %cfg, 'Config::IniFiles', -file => 'settings.ini'; # tie variable
return \%cfg; # return a reference to the tied variable
}
sub esx_host_check {
my $esx_host = config_file()->{ESX}{host}; # call sub and dereference value
}
如果您要多次使用配置哈希,那么最好构建它,然后缓存结果:
{my $cfg;
sub config_file {
tie %$cfg, 'Config::IniFiles', -file => 'settings.ini' unless $cfg;
return $cfg;
}}
这与上面有点不同。首先,我们设置config_file
成为私有变量的闭包$cfg
。请注意,它是标量而不是哈希。然后在子程序中,我们检查变量是否已初始化,如果没有,则调用tie
. tie
传递的第一个参数为%$cfg
它将未定义的值作为散列取消引用,其效果是将绑定的散列引用存储到$cfg
.
虽然有点复杂,但这种技术只需要构建配置哈希一次,可能会节省大量时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)