2013-06-26 126 views
1

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

下面的代码用于运行功能:

&{$function}(); 

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

问题是该函数必须位于同一个模块中。

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

我该怎么做?

+2

有没有这样的代码编译,甚至?我的意思是 - '严格使用;'应该使它不可能,而且你使用的是严格模式,对吧? – 2013-06-26 09:04:36

+0

...不。测试:p –

+1

听起来像是真正的背对背设计,从模块的脚本中调用函数... – plusplus

回答

3
sub call_function { 
    my $name = shift; 
    my $caller = caller; 

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

我们需要用完全限定名称来调用子。如果该子文件不是源自我们的软件包,我们需要用正确的软件包名称加前缀。内建函数caller派上用场:它返回我们的子文件被调用的包的名称。

+0

看起来很完美。谢谢。 –

+2

虽然在技术上的工作,我不会说这是很好的解决方案。禁用严格,取决于功能的特定名称。发送CODEREF更清洁,更强大。 – 2013-06-26 09:05:31

3

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

use Some::Module; 

sub whatever { ... } 

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

而在function要拨打任何()子。

您可以更改该功能以再采用一个参数,该参数将参考whatever函数。然后:

在你的主程序:

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

,并在一些::模块:

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