perl - perl通过引用调用模块函数

  显示原文与译文双语对照的内容

为了调用我编写的许多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个模块,我想在分派表中加载这些文件。 这使得我更容易将配置加载为数据,并且与代码分离。 这允许我在测试平台中加载其他模块,而无需修改代码即可修改配置文件。 高级Perl的作者 Dominus,在这个例子中有一些很好的例子。

时间: 原作者:

如果要在hello模块中引用 hello sub,则调用它,请使用:


my $code_ref = &Hello::hello;


$code_ref->();



如果要在Hello中调用名为"打招呼"的方法,可以这样做:


my $method ="hello";


Hello->$method();



原作者:

&NAME 对子程序的引用。 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(@_) };



原作者:
...