【问题标题】:Calling a Module Function By Reference通过引用调用模块函数
【发布时间】:2012-12-30 03:43:21
【问题描述】:

我正在考虑构建一个调度表来调用我编写的许多 Perl 模块。

例如,如果我有一个名为 Hello.pm 的包,其中包含一个简单的函数 hello(),我想获得该函数的代码引用。

以下不起作用:

my $code_ref=\&Hello->hello();
$code_ref->();

但如果函数 hello 从包中导出,则以下工作:

my code_ref=\&hello;
code_ref->();

有人知道第一种情况的正确语法吗?或者这根本不可能?

最后,我想用我所有的代码引用填充一个哈希表。

#####感谢所有答案

几个答案指出的正确调用是:

my $code_ref=\&Hello::hello;
$code_ref->();

我想将 10 个不同文件中的 10 个模块加载到调度表中。 这使我更容易将配置作为数据加载,并与代码分开。 这允许我在测试台中加载其他模块而无需修改我的代码——只需修改配置文件。 Higher Order Perl 的作者 Mark Dominus 有一些很好的例子。

【问题讨论】:

  • 感谢您指出这一点。我终于想通了如何接受。

标签: perl dynamic module subroutine


【解决方案1】:

如果要引用Hello模块中的hello子,那么调用它,使用:

my $code_ref = \&Hello::hello;
$code_ref->();

如果你想在Hello中调用一个名为“hello”的方法,可以这样:

my $method = "hello";
Hello->$method();

【讨论】:

  • :: 不起作用。毕竟这等价于->。我只是想了解如何在没有导出函数名称时在模块中建立对函数的引用。
  • Foo->bar()' is equivalent to Foo::bar('Foo'). THe ->` 中的 -> 表示它前面的任何内容(如对象或类名)都将是传递给作为第一个参数调用的 sub。对于Foo::bar(),情况并非如此。
  • $code_ref 是对 sub 的引用,所以这里的 -> 是取消引用它。它与用于方法调用的箭头不同。所以$code_ref->()&{$code_ref}() 相同,其中& 用于取消引用它。
  • 好的!我看到我的错字了。你好之后我有()。括号不应该在那里,因为这里的括号意味着函数调用。
  • 我不能使用 -> 因为这是所指出的方法调用。 :: 定义范围,这是正确的方法。
【解决方案2】:

\&NAME 引用一个 sub。 Hello->hello() 不是子名称。作为一个表达式,它会是一个方法调用。

要获得对方法的引用,请使用can

my $method_ref = Hello->can('hello');

如有必要,它将搜索继承树。现在您已经引用了正确的方法,您可以调用它:

Hello->$method_ref()
  -or-
$method_ref->('Hello')

如果您需要一个无法正确调用该方法的回调,则需要创建一个回调。

my $code_ref = sub { Hello->hello(@_) };

这是完全动态的样子:

my $pkg         = 'Hello';  # Also works with object!
my $method_name = 'hello';
my $method_ref  = $pkg->can($method_name);

my $callback = sub { $pkg->$method_ref(@_) };

【讨论】:

    【解决方案3】:

    你可能想要的是

    my $code_ref = \&hello;
    $code_ref->();
    

    【讨论】:

    • 除了缺少的美元符号(必须是拼写错误,因为没有它们代码甚至无法编译),这正是 OP 已经拥有的
    • 这里不需要美元符号。我们只是建立对 Hello 模块导出的函数的引用。上面的代码有效。我的简单问题是为什么我不能建立对 Hello->hello() 目录的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2013-04-29
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多