我如何引用子程序中的哈希?

ian*_*215 2 perl

我试图使用模块Config :: IniFiles的tie函数,但我无法弄清楚如何引用子例程中的哈希.如果我从子例程中删除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};
}
Run Code Online (Sandbox Code Playgroud)

我确信这很简单,但我很难过.

Eri*_*rom 7

首先,该tie函数返回表示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
}
Run Code Online (Sandbox Code Playgroud)

如果您打算多次使用配置哈希,最好构建它然后缓存结果:

{my $cfg;
sub config_file {
    tie %$cfg, 'Config::IniFiles', -file => 'settings.ini' unless $cfg;
    return $cfg;
}}
Run Code Online (Sandbox Code Playgroud)

这与上面略有不同.首先,我们设置config_file为围绕私有变量的闭包$cfg.请注意,它是标量而不是散列.然后在sub中,我们检查变量是否已经初始化,如果没有,则调用tie. tie传递第一个参数,%$cfg该参数将未定义的值解引用为散列,这具有将绑定的散列引用存储到其中的效果$cfg.

虽然稍微复杂一点,但这种技术只需要构建一次配置哈希,这可能会节省大量时间.