Во-первых, функция 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
.
Немного сложнее, но для этого метода потребуется только один раз создать конфигурационный хеш, что потенциально сэкономит много времени.