【问题标题】:Call a function in main from a module从模块调用 main 中的函数
【发布时间】:2013-06-23 07:06:13
【问题描述】:

我正在使用一个从我的主脚本调用函数的模块。

以下代码用于运行函数:

&{$function}();

其中 $function 只是被调用函数的名称。

问题是函数必须在同一个模块中。

我想从我的主脚本中调用函数。

我该怎么做?

【问题讨论】:

  • 这样的代码还能编译吗?我的意思是 - use strict; 应该让它不可能,而且你使用的是严格模式,对吧?
  • 听上去真的是从后到前的设计,从模块调用脚本中的函数...
  • 你是说这是个坏主意?该模块是一个小型计时器库。尝试使用更好的实现,但对我的使用来说太复杂了

标签: perl


【解决方案1】:
sub call_function {
  my $name = shift;
  my $caller = caller;

  no strict 'refs';
  my $output = &{ $caller . "::" . $name }();
}

我们需要使用完全限定的名称来调用 sub。如果 sub 不是源自我们的包,我们需要在它前面加上正确的包名。 caller 内置函数派上用场了:它返回调用我们的 sub 的包的名称。

【讨论】:

  • 虽然在技术上可行,但我不会说这是一个好的解决方案。禁用严格,取决于函数的特定名称。发送 CODEREF 更简洁、更强大。
【解决方案2】:

让我们假设你的主程序中有:

use Some::Module;

sub whatever { ... }

Some::Module::function(1,2,3);

function 中你想调用whatever() sub。

您可以更改该函数以多接受一个参数,该参数将引用whatever 函数。然后:

在你的主程序中:

Some::Module::function(1,2,3,\&whatever);

在 Some::Module:

sub function {
    my ($x, $y, $z, $more_work) = @_;
    ...
    $more_work->();
}

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多