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

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(使用前将#替换为@)

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

  • 如何将文本转换为标题大小写?

    我有一个文本文件 其中包含需要更改为标题大小写的标题列表 单词应以大写字母开头 但大多数冠词 连词和介词除外 例如 这个书名列表 barbarians at the gate hot flat and crowded A DAY LATE
  • Perl 单元测试只针对模块,而不针对程序吗?

    我在网上找到的文档和我拥有的书 Perl测试 或者说或者建议 Perl 的单元测试通常是在创建模块时完成的 这是真的 有没有办法使用单元测试实际程序Test More和表兄弟姐妹 当然 您可以使用测试脚本测试 更多 http search
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • 如何为自定义 Perl 模块选择一个不与内置或 CPAN 包名称冲突的包名称?

    我已阅读模块上的 perldoc http perldoc perl org perlmod html 但我没有看到关于命名包的建议 这样它就不会与内置或 CPAN 模块 包名称冲突 过去 为了开发本地Session pm模块 我使用我公司
  • 找不到 DBI.pm

    我正在尝试启动这个脚本 usr bin perl use DBI my dbh DBI gt connect dbi Oracle host lonlin2 sid TIMFX1AD port 1524 xbsesdbo xbsesdbo1
  • Perl 是否有相当于 Python 的 `if __name__ == '__main__'` 的功能?

    有没有一种方法可以确定当前文件是否是 Perl 源中正在执行的文件 在 Python 中 我们使用以下结构来做到这一点 if name main This file is being executed raise NotImplemente
  • 向用户提示多个问题(是/否和文件名输入)

    我想问用户多个问题 我有两种类型的问题 是 否或文件名输入 我不知道如何将这一切放入一个好的if结构 我不确定是否也应该使用 else 语句 有人可以帮我们解决这个问题吗 这是我到目前为止所拥有的 print Do you want to
  • Perl 的反引号、system 和 exec 有什么区别?

    有人可以帮帮我吗 在 Perl 中 以下之间有什么区别 exec command and system command and print command 还有其他方法可以运行 shell 命令吗 exec 执行命令并一去不复返 这就像一个
  • 你能挽救我的负面回顾示例来传达数字吗?

    在 高级正则表达式 一章中掌握 Perl http oreilly com catalog 9780596527242 我有一个损坏的示例 我无法找到一个很好的修复方法 这个例子可能为了自己的利益而试图变得太聪明 但也许有人可以帮我解决它
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 快速 Perl signint 处理程序

    收到 Ctrl C 时处理程序清理的最方便 最清晰的方法是什么 例如 当我的套接字服务器以这种方式被终止时 TCP 套接字永远不会关闭 我想要一个很好的衬里 我可以将其放在程序的顶部来设置 sigint 处理程序 或类似 atexit 的东
  • Perl:正则表达式不抓取代码中的多行 C 风格注释

    我有一个 Perl 程序 读取用 C 编写的 SRC 文件 使用 SRC 文件中的正则表达式匹配来查找特定格式的数据以用作目标文件名 打开新的目标文件 执行另一个正则表达式匹配以查找包含关键字 abcd 的所有 C 风格注释 注意 这些注释
  • 如何在 Perl 中使用原始套接字?

    你怎样才能得到一个rawPerl 中的套接字 那么构建与其一起使用的数据包的最佳方法是什么 与在 C 中执行的操作相同 通过在创建套接字时设置套接字类型 在示例中CPAN http search cpan org rgarcia perl
  • 如何在 Perl 中循环访问类的所有方法?

    如何在 Perl 中循环访问一个类的所有方法 有没有关于 Perl 内省或反射的好的在线参考 Todd Gardner 使用 Moose 的建议很好 但他选择的示例代码并不是很有帮助 如果你正在检查一个非 Moose 使用类 你会这样做 u
  • Perl regex:如何知道匹配数

    我循环遍历一系列正则表达式并将其与文件中的行进行匹配 如下所示 for my regex regexs ref LINE for rawfile regex do do something here next LINE 有没有办法让我知道我
  • 如何忽略 perl 中的“证书验证失败”错误?

    我想访问一个无法验证证书的网站 我正在使用 WWW Mechanize 获取请求 那么如何忽略这一点并继续连接到该网站呢 use IO Socket SSL qw use WWW Mechanize qw my mech WWW Mecha
  • 如何修复 Math::BigInt 调用的 Math::Pari 中的“`as_number' 不是 Pari 函数名称”?

    在 Perl 5 8 5 上 我看到问题中列出的错误 我正在运行这些版本模块 数学 BigInt 1 89 数学 BigInt FastCalc 0 19 数学 BigInt GMP 1 24 数学 BigInt Pari 1 13 数学

随机推荐

  • 保存复选框状态

    我需要知道是否可以保存 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但我不知道如何引用子例程内部的哈希 如果我从