如何优雅地调用名称保存在变量中的 Perl 子例程?

2024-01-10

我将要在运行时调用的子例程的名称保存在名为 $action 的变量中。然后我用它在正确的时间调用该子程序:

&{\&{$action}}();

工作正常。我唯一不喜欢的是它很丑,每次我这样做时,我都觉得有义务为下一个开发人员添加评论:

# call the sub by the name of $action

有人知道这样做的更漂亮的方法吗?


更新:这里的想法是避免每次添加新的可调用子项时都必须维护调度表,因为我是唯一的开发人员,我不担心其他程序员遵循或不遵循“规则”。为了我的方便牺牲了一点安全性。相反,我的调度模块会检查 $action 以确保 1) 它是定义的子例程的名称,而不是使用 eval 运行的恶意代码,2) 它不会运行任何以下划线开头的子程序,这将是通过此命名约定标记为仅供内部使用的子程序。

对这种方法有什么想法吗?我总是会忘记将调度表中的子例程列入白名单,而且我的客户宁愿我犯“它有效”而不是“它非常安全”的错误。 (开发应用程序的时间非常有限)


最终更新:我想我毕竟已经决定了调度表。虽然我很好奇是否有人读过这个问题,是否曾试图废除一个,以及他们是如何做到的,但我必须屈服于这里的集体智慧。感谢大家,有很多很棒的回复。


与其将子例程名称存储在变量中并调用它们,更好的方法是使用子例程引用的哈希值(也称为调度表 https://en.wikipedia.org/wiki/Dispatch_table.)

my %actions = ( foo => \&foo,
                bar => \&bar,
                baz => sub { print 'baz!' } 
                ... 
              );

然后你就可以轻松地调用正确的方法:

$actions{$action}->();

您还可以添加一些检查以确保$action是哈希中的有效密钥,等等。

一般来说,您应该避免符号引用(您现在正在做的事情),因为它们会导致各种问题。此外,使用真正的子程序引用将与strict打开。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优雅地调用名称保存在变量中的 Perl 子例程? 的相关文章

  • 哪一个代表null? undef 或空字符串

    我想插入null在表的一列中 哪一个代表null undef或空字符串 应该使用哪一种 为什么 我知道关于defined我可以检查一下 但我更多的是从数据库的角度来看 代表哪一个null更合适吗 Update 我在用DBI module D
  • perl imap 将邮件移至垃圾箱 (Mail::IMAPClient)

    我需要将所有未见的邮件移至垃圾箱 然后从收件箱中删除 my inbox imap gt select Inbox my mails imap gt unseen foreach my msgid mails imap gt set flag
  • perl xs - 从 c 数组返回 perl 数组

    使用 XS 我尝试将值从 C 数组传递到可在脚本中使用的 Perl 数组 这是我的 xs 文件中的代码 AV DoubleArray getPerlArray CODE r newAV for size t i 0 i lt THIS gt
  • 如何设置 $!在 Perl 中

    我想在 perl 中编写一些设置 的函数 与内置 perl 函数类似 当我尝试执行此操作时 它抱怨 参数 无法创建管理员用户 在标量分配中不是数字 我试过用谷歌搜索这个 但不幸的是谷歌不会在 所以结果很难得到 if createUser a
  • 检测 perl 中声明的包变量

    Given package main our f sub f sub g 1 我怎样才能确定 f 但不是 g 已宣布 即兴的 我以为 main g SCALAR 可能是未定义的 但它是一个善意标量参考值 背景 我想将一个变量导入到main
  • 使用 Getopt::Long 解析参数的最简洁方法

    我使用 GetOpt 来解析命令行参数 我想添加一个新选项 multi 它应该得到一个如下所示的字符串 key1 abc key2 123 key3 xwz 我不知道用户想要提供多少个自定义密钥 但他可以提供 minimax5键 另外 我想
  • 使用 Perl 分割大文本文件

    我必须将一个 1 8Tb 的大文本文件分成两部分 我只需要文件的后半部分 该文件有 n作为记录分隔符 I tried perl ne print if gt line to start from test txt gt result txt
  • 将参数传递给调试器中的 perl 文件并在系统执行的文件中设置断点

    因此 我使用 perl d file pl 在 perl 调试器中运行一个文件 但 file pl 也应该接受参数 如何向 file pl 提供参数 还有一个问题 file pl 中有这一行 system file2 pl 如果 file2
  • Moose:属性值更改时缓存的计算结果会过期吗?

    在我们的类中 我们有一个模式 我们创建一个属性来表示 计算值 出于显而易见的原因 我们想要缓存计算值 然后当基础值之一发生变化时使缓存失效 所以我们目前有这个 package FooBar use Moose has foo gt acce
  • 如何在 perl 程序中查找打开的全局文件句柄

    我刚刚发现一个问题 我必须关闭所有打开的文件句柄才能让我的 Apache cgi 脚本继续 我将问题追溯到 Parse RecDescent usr bin env perl use strict use warnings use feat
  • 如何为自定义 Perl 模块选择一个不与内置或 CPAN 包名称冲突的包名称?

    我已阅读模块上的 perldoc http perldoc perl org perlmod html 但我没有看到关于命名包的建议 这样它就不会与内置或 CPAN 模块 包名称冲突 过去 为了开发本地Session pm模块 我使用我公司
  • 如何在 Perl 脚本中包含另一个文件中的函数?

    这似乎是一个非常简单的问题 但不知何故 我的 Google Fu 失败了 在 Perl 中包含其他文件中的函数的语法是什么 我正在寻找类似C的东西 include blah h 我看到了使用 Perl 模块的选项 但这似乎需要对我当前的代码
  • Parse::RecDescent 语法未按预期工作

    我所能做的就是 STRING PARAMS VARIABLE 和 FUNCNAME FUNCTION 似乎有问题 但我就是看不到它 use strict use Parse RecDescent RD ERRORS 1 Make sure
  • OpenSSL DH 密钥太小错误

    我正在尝试使用简单的 PERL 脚本连接到封闭的服务器 空调 usr bin perl use 5 10 1 use warnings use strict use IO Socket SSL use IO Socket SSL qw de
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • grep 两个分隔符之间的子字符串

    我有很多bash使用的脚本perl内的表达式grep为了提取两个分隔符之间的子字符串 例子 echo BeginMiddleEnd grep oP lt Begin End 问题是 当我将这些脚本移植到运行的平台时busybox 融合的 g
  • Perl 语言的目标是在运行时生成快速的程序吗?

    最近有朋友告诉我 看 Perl 从来就不是为了快而设计的 真的吗 我能找到的相关信息是来自维基百科 http en wikipedia org wiki Perl Overview 该语言旨在实用 易于使用 高效 完整 而不是美观 微小 优
  • 从 php 执行 bash 脚本并立即输出回网页

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

    看来我有点失落了 我需要解析一个大的 大约 100 mb 且相当难看的 xml 文件 如果我使用parsefile 它返回错误 文档元素后的垃圾 但它会很乐意解析文件的较小元素 所以我决定将文件分解为元素并解析它们 由于不鼓励使用正则表达式
  • Perl 和 Selenium::远程::驱动程序

    再次编辑 我在弗吉尼亚州北部某处的 AWS 上有一台服务器 这是我的监控服务器 我从另一个状态 ssh 进入这个 Ubuntu 服务器来进行系统管理 我想在这台服务器上进行 Web 自动化测试 它将测试互联网上的 Web 应用程序 点击 U

随机推荐

  • Chrome 的自动填充隐藏文本输入的背景图像

    成功禁用自动填充黄色背景颜色后 我偶然发现了另一个功能 我的每个输入元素都有一个背景图像 每次我关注文本输入时 浏览器都会在下拉列表中建议我之前使用的值 选择一个值后 自动填充会覆盖整个背景并隐藏图像 这是我的 html 和 css 在 J
  • NHibernate:System.Argument异常:已添加具有相同键的项目

    我遇到了一个很难重现的偶发错误 我的第一个猜测是 不知怎的 我有一个泄漏的休眠会话 但是当我运行休眠分析器 http nhprof com 我没有看到太多异常 MVC 2 0 流畅版本1 1 0 685 NHibernate 版本 2 1
  • 使用三元运算符初始化结构

    为什么三元运算符不能用于初始化结构类型 而可以用于初始化基类型 例如int 示例代码 include
  • javascript向所有函数添加原型方法?

    有没有一种方法可以在不使用原型库的情况下向所有 javascript 函数添加方法 类似于 Function prototype methodName function return dowhateverto this 这是我到目前为止所尝
  • Perl 6 中有快速并行“for”循环吗?

    给定一些对 1 到 500000 之间的每个数字进行一些数学 转换的代码 我们有选择 简单的for循环 for 500000 gt i my result i 2 Str 在我的不科学基准测试中 这需要 2 8 秒 最规范的并行版本在一个P
  • 新的 SQL Server 用户登录失败

    我已在 SQL Server Management Studio SQL Server 2008 Express 的安全选项卡中创建了新用户 指定登录名 SQL Server 身份验证 输入密码 分配服务器角色sysadmin 映射到我的数
  • 如何检查元素是否在 iframe 内

    假设您有一个 DOM 节点 并且您想知道它是否位于 iframe 内 一种方法是检查它的父链 看看您是否在到达父窗口之前到达了 iframe 不过 我想知道是否有更快的方法来做到这一点 你也许可以检查ownerDocument财产 http
  • 强制使用 SSL:尝试确定托管应用程序的 DNC 进程的进程 ID 时发生错误

    我想在我的网站上强制使用 https 如果发现本文 https azure microsoft com en us documentation articles web sites configure ssl certificate 4 e
  • 使用 Perl 发送电子邮件

    我正在尝试使用 Perl 发送电子邮件 基本上我有一个 Perl 脚本 可以以良好的格式打印出报告 我希望通过电子邮件发送该报告 我怎样才能做到这一点 如果机器没有配置sendmail 我通常使用邮件 发送邮件 https metacpan
  • 如何根据位置分割字符串

    我想根据字符的位置拆分变量 生成的第一个字符串应具有指定位置之前的前一个位置 另一个字符串应包含其他部分 假设如果我有一个变量 var 2013AD 我想 var1 2013 and var2 AD 我怎样才能实现这个目标 嗯 要在这里使用
  • 如何使用 Selenium WebDriver 检查单选按钮?

    我想检查这个单选按钮 但我不知道如何检查 我的 HTML 是 div class appendContent div id contentContainer class grid list template gt div div div d
  • AEM Scheduler 的配置发生变化吗?

    我正在尝试为我的项目需求实现简单的调度程序 我的项目正在使用Adobe AEM 截至目前 我浏览了 Adob e 网站并尝试实现所提供的给定示例 但没有一个更新我的error log file package sling docu exam
  • Android 项目未解析任何静态资源

    由于某种原因 我的 android 项目无法解析 js css 图像的任何静态路径 而它在 web 和 ios 上运行良好 我没有使用离子 所以也许我错过了一些特定的东西 然而 所有这些文件都可以在 android 项目中使用 这是突出显示
  • 训练 Keras 模型会产生多个优化器错误

    所以我需要使用我自己的数据集重新训练 Tiny YOLO 我正在使用的模型可以在这里找到 keras yolo3 https github com qqwweee keras yolo3 我开始训练 遇到多个优化器错误 添加了错误代码以防止
  • Java 中的 Process.exitValue()

    下面是我用来简单地从命令行程序打开和关闭 Internet Explorer 的程序 我在 Windows XP 操作系统上使用 Java 6 运行我的程序 Runtime runtime Runtime getRuntime Proces
  • PHPUnit 严格模式 - 如何更改默认超时

    我想继续在严格模式下运行我的单元测试 以便我可以轻松地了解任何异常长的测试 但同时 1 秒的默认超时是不够的 我可以为所有测试更改它吗 我知道我可以使用以下命令为每个课程 和单独的测试 设置超时 short medium long注释 但是
  • 模型不学习

    背景 我有一个非常简单的脚本 它创建了一个 keras 模型 旨在充当异或门 我在中生成了 40000 个数据点get data功能 它创建两个数组 一个按某种顺序包含 1 和 0 的输入数组 以及一个 1 或 0 的输出 Issue 当我
  • 如何在手机上安装特定版本的 Android 进行测试?

    我的老板最近给了我一部 HTC Wildfire 手机 用于制作我们的一个移动应用程序的 Android 版本 这一切都很好 只是该应用程序需要 API 级别 8 即 Android 2 2 而手机本身只有 Android 2 1安装 经过
  • 如何处理Retrofit 2.0中的错误

    我想处理 Retrofit 2 0 中的错误 得到例如code 404 and body null but errorBody 包含数据在ErrorModel Boolean status and String info This is e
  • 如何优雅地调用名称保存在变量中的 Perl 子例程?

    我将要在运行时调用的子例程的名称保存在名为 action 的变量中 然后我用它在正确的时间调用该子程序 action 工作正常 我唯一不喜欢的是它很丑 每次我这样做时 我都觉得有义务为下一个开发人员添加评论 call the sub by