如何在子例程内引用哈希?

2023-12-24

我正在尝试使用模块的 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(使用前将#替换为@)

如何在子例程内引用哈希? 的相关文章

随机推荐

  • 保存复选框状态

    我需要知道是否可以保存 a 的状态CheckBox在 C 中 我的意思是如果我检查CheckBox并关闭程序 一旦我重新启动程序CheckBox仍将保持检查状态 是否有可能 这是一个相当普遍的问题 您需要以某种方式自己序列化状态 但是如何以
  • 如何将字节写入文件?

    我有一个返回字符串的函数 该字符串包含回车符和换行符 0x0D 0x0A 但是 当我写入文件时 它仅包含新的换行符 有没有办法让输出包含回车符和换行符 msg function arg1 arg2 arg3 f open tmp outpu
  • 如何在无镜像包的flutter中使用ByteData和ByteBuffer

    我正在尝试开发一个 UDP 应用程序来接收数据并将字节转换为不同的数据类型 我有下面的代码 可以在单独使用 Dart 时使用 import dart io import dart typed data import dart mirror
  • 如何将常量作为函数名来调用?

    在 PHP 中 您可以通过在变量中调用函数名称来调用函数 function myfunc echo works func myfunc func Prints works 但是 你不能用常量来做到这一点 define func myfunc
  • Ruby 符号的存在是因为字符串是可变的且不可保留的吗?

    我使用 Ruby 已经大约一年了 有一个语言问题 符号是否是必要的 因为 Ruby 字符串是可变的且不被保留 例如 在 Java 中 字符串是不可变的且被保留的 所以 foo 在值和引用上总是等于 foo 并且它的值不能改变 在 Ruby
  • 使用 sklearn 对单变量时间序列进行聚类

    我有一个 panda DataFrame 我想从中对每一列进行聚类 我正在使用 sklearn 这就是我所拥有的 data pd read csv data csv data pd DataFrame data data data set
  • 两个python脚本之间的通信

    一个方法论问题 我有一个 主 python 脚本 它在我的系统上无限循环运行 我想偶尔向它发送信息 例如 json 数据字符串 以及一些其他 python 脚本 这些脚本稍后将由我自己或另一个程序启动并在发送字符串后立即结束 我不能在这里使
  • WPF如何使文本框在按回车键后失去焦点

    我创建了一些文本框 我希望用户在其中输入十进制值 在我使用过的每个应用程序中 当我在文本框中输入内容并按 Enter 键时 该值将被接受并且文本框会失去焦点 我怎样才能在我的应用程序中做到这一点 我知道通过关键事件应该相对容易做到这一点 但
  • CQRS(事件溯源):具有多个聚合的预测

    我有一个关于 CQRS 架构上涉及多个聚合的投影的问题 例如 假设我有两个聚合WorkItem and Developer并且以下事件按顺序发生 但不是立即发生 工作项已创建 工作项Id WorkItemTitleChanged workI
  • 将索引中的 meta_search gem 与现有的地理编码器 gem 搜索集成 (rails)

    我已经使用地理编码器实现了基于位置的搜索 但在集成 meta search gem 时遇到了问题 我正在尝试将 meta search 集成到我的object controller index允许用户按对象过滤和排序搜索结果 attribu
  • Twitter API 错误 215

    今天 我们发现我的一位客户的 Twitter 信息被破坏了 我尝试切换到使用新的 API 1 1 但出现以下错误 errors message Bad Authentication data code 215 即使使用他们自己的示例也会生成
  • 透明、点击、始终位于顶部的 JFrame [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 因此 我目前有一个透明的 JFram
  • TweenLite 没有动画

    我正在尝试使用 GreenSocks TweenLite for Javascript 制作一个简单的上边距动画 我已经使用过该库很多次了 但是由于某种原因 这次它不起作用 注意 onComplete 正在触发 但是无论我使用什么元素 我都
  • 内容安全策略:允许所有外部图像?

    我希望只允许来自本地服务器的脚本 但有某些例外 例如 jQuery 等 但可以灵活地加载外部图像 我知道有一个像这样的指令 Content Security Policy script src self https apis google
  • 将 ADT 和 Android sdk 工具更新到最新版本 22 后出现类未找到错误

    早些时候它工作正常 当我将我的 adt 和 android sdk 工具更新到最新版本 rev 22 时 我的应用程序停止工作 下面是 logcat 输出 请帮忙 05 16 16 36 01 922 E AndroidRuntime 12
  • 使用 Highcharts.js 的圆边仪表

    我正在使用 Highcharts 创建自定义仪表 窗格形状应如所附图片所示为圆形 想知道是否有人知道如何使用该库实现此布局 这是http jsfiddle net ao9fv2yh http jsfiddle net ao9fv2yh 我正
  • Git:忽略已编译的 Google Go

    我编译的 Go 代码在 Linux 上没有以扩展结尾 对于处理忽略 gitignore 文件中的这些内容有什么技巧吗 如果您正在使用go您可以使用构建代码的工具 o标志来指定输出文件名 因此您可以使用go build o bin elf然后
  • .NET 世界中的 ORM 和 SOA [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 根据我的经验 NET 的主要 ORM 框架 NHibernate http nhforge org Linq 转 Sql http msdn m
  • 为什么 Android 会截断我的 ActionBar 标题?

    在我的应用程序中 我更改了 ActionBar 中显示的每个片段的标题 当我第一次启动我的应用程序时 我收到了一个请求列表 因此我的标题是 我的请求 20 然后 当您单击该列表中的某个项目时 它会替换我的活动中的一个片段 并将标题设置为 操
  • 如何在子例程内引用哈希?

    我正在尝试使用模块的 tie 功能配置 Ini文件 http search cpan org shlomif Config IniFiles 2 65 lib Config IniFiles pm但我不知道如何引用子例程内部的哈希 如果我从