如何在perl中动态加载模块并执行方法

2023-12-21

我正在跟进此事question https://stackoverflow.com/questions/6336270关于 Perl Web 服务。我已经设法从主程序加载和执行模块。每个模块都是这样的:

#!/usr/bin/perl
package NiMbox::perlet::skeleton;

use strict;
use warnings;

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(%DEFINITION main secondary);

our %DEFINITION;
$DEFINITION{'main'} = {
    summary => 'skeleton main',
    description => 'long skeleton main description',
    args => { 'box' => {}, 'other' => {} }
};
$DEFINITION{'secondary'} = {
    summary => 'skeleton secondary',
    description => 'long skeleton secondary description'
};

sub main {
    print "main...\n";
}

sub secondary {
    print "secondary...\n"
}

1; 

然后可以像这样调用这些模块:

use NiMbox::perlet::skeleton;

my %DEFINITION = %NiMbox::perlet::skeleton::DEFINITION;
foreach my $s (keys %DEFINITION) {
    print "calling sub '$s'\n";
    NiMbox::perlet::skeleton->$s();
}

我如何摆脱直接调用NiMbox::perlet:skeleton以一种方式,我可以做一些看起来像这样的事情(这不起作用,但说明了我需要做的事情):

my $perlet = 'skeleton';

use NiMbox::perlet::$perlet;

my %DEFINITION = %NiMbox::perlet::$perlet::DEFINITION;
foreach my $s (keys %DEFINITION) {
    print "calling sub '$s'\n";
    NiMbox::perlet::$perlet->$s();
}

因为我非常接近,所以我宁愿看看这个示例中缺少什么,而不是使用另一个库。有任何想法吗?


如果你想让类名动态化,你可以这样做:

my $class = 'NiMbox::perlet::' . $perlet;
my $class_file = $class;
$class_file =~ s{::}{/};
$class_file .= '.pm';

require $class_file;
$class->import;

(或者更好的是,使用模块::加载 http://search.cpan.org/~bingos/Module-Load/lib/Module/Load.pm as @Schwern 建议 https://stackoverflow.com/questions/6525524/how-to-dynamically-load-modules-and-execute-methods-in-perl/6525677#6525677.

得到%DEFINITIONclass 有点棘手,因为它涉及符号引用。更好的方法是提供一个返回它的类方法,例如

package NiMbox::perlet::skeleton;
...
sub definition { 
    my %definition;
    $definition{main} = { summary => 'skeleton main', ... };
    return %definition;
}

然后你可以做类似的事情:

my %DEFINITION = $class->definition;
foreach my $s( keys %DEFINITION ) { 
    print "calling sub '$s'\n";
    $class->$s;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在perl中动态加载模块并执行方法 的相关文章

  • Perl:测试输入阅读器?

    有没有一种方法可以使用标准 Test 等模块自动测试 Perl 程序是否正在读取输入 例如标准输入正确吗 例如 测试一个从 STDIN 读取两个整数并打印它们之和的程序 这不是 100 清楚你的意思 我会回答假设你想编写一个测试脚本来测试你
  • 从 php 执行 bash 脚本并立即输出回网页

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

    收到 Ctrl C 时处理程序清理的最方便 最清晰的方法是什么 例如 当我的套接字服务器以这种方式被终止时 TCP 套接字永远不会关闭 我想要一个很好的衬里 我可以将其放在程序的顶部来设置 sigint 处理程序 或类似 atexit 的东
  • 如何将 NTLM 身份验证与 Perl 的 SOAP::Lite 模块集成?

    此 Perl 代码适用于对 ASP NET Web 服务的匿名访问 但当打开集成安全性时 该服务会返回 401 错误 我认为我需要将 NTLM 模块与 SOAP Lite 结合使用 但尚不清楚如何做到这一点 如何集成这些组件 use SOA
  • 如何彻底删除 Perl 中的包?

    如何在 Perl 中彻底删除一个包 这不仅意味着包变量 还意味着 Perl 更新以处理继承更改和其他事情的任何魔术表 这个简单的测试 use warnings use strict use Test LeakTrace use Symbol
  • Perl regex:如何知道匹配数

    我循环遍历一系列正则表达式并将其与文件中的行进行匹配 如下所示 for my regex regexs ref LINE for rawfile regex do do something here next LINE 有没有办法让我知道我
  • 按值和键对哈希进行排序(按顺序)

    我正在寻找一种很好的方法来在 Perl 中先按值排序 然后再按键排序 Example my userids williams gt Marketing smith gt Research johnson gt Research jones
  • 如何在 Perl 脚本中加密或隐藏密码?

    我正在研究 Perl 脚本 它使用Expect http search cpan org dist Expect通过 telnet 登录到远程计算机 不要问 必须使用 telnet 我还根据需要执行 perforce p4 登录操作 并使用
  • 如何在 PHP 中反序列化 Perl Data::Dumper 输出

    我在 Perl 中有一个导出变量的结果 如下字符串 VAR1 guard gt undef work hand gt undef images gt 1 gt mini height gt 150 width gt 150 extensio
  • Perl `join` 生成多行字符串

    我有这个程序来对两个数组进行排序 usr bin perl w movies movies txt open FHD movies die could not open movies n movies
  • 如何从 Perl 中的文本文件中提取/解析表格数据?

    我正在寻找类似的东西HTML 表格提取 http search cpan org dist HTML TableExtract 只是不适用于 HTML 输入 而是适用于包含采用缩进和间距格式化的 表格 的纯文本输入 数据可能如下所示 Her
  • 在 perl 中 \*STDIN 与 STDIN 相同吗?

    我是作者Python化者 https github com snoopyjc pythonizer我正在尝试将 CGI pm 的代码从标准 perl 库翻译为 Python 我在中遇到了这段代码从客户端读取 https metacpan o
  • 如何通过 sudo (或作为另一个用户)打开 Perl 文件句柄写入数据

    我想将数据写入文件 但应使用特定用户的访问权限打开文件句柄 因此 有以下声明 open FH gt filename or die n 将允许以该特定用户的身份写入文件 有没有办法在 Perl 脚本中执行此操作 而无需运行整个脚本sudo
  • getoptions 函数 perl 多值不起作用

    具有以下 getoptions 功能 iifiles 参数是可选的 如果提供的话它可以是一对多 但是当我运行此函数时收到错误消息 选项规范错误 Perl 在Solaris 10 上运行 不确定需要为iiles 提供哪些多值选项 GetOpt
  • Perl:管理 Windows 上的路径编码

    我正在努力处理包含非英文字符的路径 Activestate Perl Windows XP 如何打开 写入 复制等位于包含希腊语 俄语 法语重音字符的路径中的文件 假设我要将 text txt 文件复制到的目录是 C Documents a
  • 如何绑定值 INSERT INTO mysql perl

    我有下面的代码可以工作 但我需要知道如何绑定它们以确保安全 如果我只是将 new row 替换为 并将其放入执行中我收到错误 感谢您的帮助 foreach my field account field order new row param
  • 如何匹配单引号字符串中的双反斜杠?

    我需要区分带有单反斜杠和双反斜杠的字符串 Perl 对它们一视同仁 print n qqq www eee rrr print n qqq www eee rrr 将给出相同的结果 qqq www eee rrr qqq www eee r
  • Web 开发中的 Perl [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Perl 中,如何制作数组的深层复制? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Perl 中制作数据结构深层复制的最佳方法是什么 https stackoverflow com questions 388187 whats the best way to make a dee
  • 在 Perl 中查找数组的大小

    我似乎遇到过几种不同的方法来查找数组的大小 这三种方法有什么区别呢 my arr 2 print scalar arr First way to print array size print arr Second way to print

随机推荐

  • laravel查询php如何获取范围内的最大值

    hello how do i get the max value of scores where column ID range starts at 3 5 example table 我想获得分数的最大值 其中列ID范围为3 5 请帮忙
  • 替换 ASP.NET vNext 中的 HttpHandler

    我读到 HttpHandlers 不是 ASP NET 5 vNext 的一部分 是否有可以使用的替代品 其工作原理相同 我正在寻找一种可以根据实体的 id 加载图像的解决方案 如果该图像不存在 则应显示 非图像 图像 这与 http 处理
  • 在 sp_execute_external_script 中使用时出现 pyodbc.OperationalError

    我的 Python 代码在从 PyCharm 运行时运行良好 但是当我使用 SQL Server 运行相同的代码时sp execute external script 我收到错误 知道这是怎么回事吗 Python代码 import pyod
  • YCM 找不到我的标头?

    我有以下文件夹结构 include ctset hashtable h set h src hashtable hashtable c And in hashtable c包括 include ctset hashtable h 但 YCM
  • CSS - 浮动到最大宽度

    所以我在半弹性容器中制作一排物品 左侧有一个个人资料图像 然后内容浮动到其右侧 两者都向左浮动 我想做的是使内容浮动为最大可能宽度而不是最小可能宽度 作为浮动原因 CSS container max width 800px min widt
  • 保存身份验证令牌的最佳方法?

    我一直致力于用 C 实现 api 实施进展顺利 但我确实遇到了一个问题 当我的图书馆对 api 进行授权时 我有一个 auth token 我用它来对 Web 服务进行后续查询 令牌需要在程序运行之间保留 因为它对用户来说保持不变 尽管我确
  • 使用堆算法生成排列

    我正在尝试使用我在维基百科中找到的堆算法生成数组的所有排列 这是我到目前为止所尝试的 n lt 3 A lt c 1 2 3 perm lt function n A if n 1 print perm for i in length A
  • AlertDialog setOnShowListener 从未调用过

    我使用稍微不同的方法 以便在按下按钮时保持对话框打开 AlertDialog Builder builder new AlertDialog Builder NewTableActivity this builder setTitle R
  • Delphi 10.2 for Win64 发布目标下的 FillChar 和 StringOfChar

    我有一个关于 Delphi 10 2 Pascal 编程语言中特定编程问题的问题 StringOfChar 和 FillChar 在 2012 年之前发布的 CPU 上的 Win64 版本构建下无法正常工作 FillChar 的预期结果只是
  • 使用bool(返回类型)来处理异常或将异常传递给客户端?

    我正在尝试找出处理异常的最佳方法 我的应用程序有多个层 并开始使用 BOOL 返回类型 即如果失败则返回 False 如果成功则返回 True 这在 SaveMyRecord somerecord 等方法中非常有效 因为我传入值并且不需要返
  • 如何在 Laravel 中从外键查看表字段

    我是 Laravel 的新手 不擅长语法 我想通过外键 该表的 ID 查看另一个表的值 https ibb co pXRFRHn https ibb co pXRFRHn你可以在这张图片中看到我在用户和类别下获得了 id 我想要与这些 id
  • LibGdx 如何对 HP Bar 进行编程?

    我目前正在尝试使用 LibGdx 编写游戏 我的游戏有很多结构部分 我现在正在寻求让游戏向玩家返回信息 我能想到的 UI 最简单的概念是 HP 条和弹药计数器 用于子弹 箭头等 这可以通过我的 GameScreen 类中的舞台和演员来完成吗
  • .NET Core 128kb 部署到 Azure 应用服务的文件大小限制

    我有一个在 Azure 应用服务实例上运行的 NET Core 2 0 Web 应用程序 当我尝试使用上传文件时file CopyToAsync 如果文件大于 128kB 则上传失败且没有诊断输出 某些照片类型 例如 png 即使大小有几
  • 如何将 List 的值而不是引用复制到另一个列表中?

    也就是说 在不引用同一对象的情况下 我需要将一个列表的元素值复制到另一个列表中 这些是列表 List
  • 编译期间的“Ignoring InnerClasses attribute”警告输出是什么?

    我是 Android 新手 正在使用Ical4j用于解析 ICS Outlook 日历 文件的库 但是 当我在 Eclipse 中构建应用程序时 控制台中多次出现以下警告 2010 07 22 15 58 31 Google 日历上传 警告
  • 排除重叠间隔

    我有两个间隔列表 我想从 list1 中删除 list2 中已存在的所有时间 例子 清单1 0 10 15 20 List2 2 3 5 6 Output 0 2 3 5 6 10 15 20 有什么提示吗 当时尝试删除一个间隔 但似乎我需
  • Python Flask 应用程序未随 sys exit 退出[重复]

    这个问题在这里已经有答案了 我希望能够使用如下 http 请求远程终止我的 Flask 应用程序 import flask import sys master flask Flask name master route shutdown d
  • Python 将 URL JSON 响应转换为 pandas 数据帧

    您好 我正在使用以下代码从 Python 调用 Web 服务 response urllib request urlopen req string response read decode utf 8 json obj json loads
  • MBCalendar套件框架如何添加到我的项目中

    I used MBCalendar套件框架 并成功添加到我的项目中 但问题是月份和日期无法显示模拟器 本周和今年的展会中只有一场顶级酒吧展会 我附上了我的输出快照 请找到它并在下面显示 我想在用户界面中成功显示日历 怎么可能请帮忙 impo
  • 如何在perl中动态加载模块并执行方法

    我正在跟进此事question https stackoverflow com questions 6336270关于 Perl Web 服务 我已经设法从主程序加载和执行模块 每个模块都是这样的 usr bin perl package