我试图在perl中执行以下伪代码
#!/usr/bin/perl -w
#App.pm
use strict;
use OtherModule;
use Other2Module;
sub App::hashF
{
my $hash_funtion = {
'login' => OtherModule::login,
'logout' => Other2Module::logout
};
my($module, $params) = @_;
return $hash->{$module}($params);
}
但我得到的错误如下: - 不能使用字符串(“login”)作为子程序ref,而“strict refs” - 不能使用bareword(“OtherModelo”)作为HASH引用,而“strict refs”
答案 0 :(得分:7)
我决定增强您的代码:
#!/usr/bin/perl
#App.pm
use strict; use warnings;
package App;
use OtherModule;
use Other2Module;
my $hash = {
login => \&OtherModule::login,
logout => \&Other2Module::logout,
};
sub hashF
{
my($module, @params) = @_;
return $hash->{$module}->(@params);
}
我们无法指定裸名称,但我们可以传递代码引用。 &
Sigil表示“代码”类型或子例程,\
给出了对它的引用。 (没有获得引用会执行代码;不是我们想要的东西。永远不要执行&subroutine
无条件。)
BTW:哈希只能保存标量值,(代码)引用是一种标量。
当我们想要从哈希调用我们的子时,我们必须使用解除引用运算符 ->
。
$hash->{$module}
返回代码引用作为值; ->(@arglist)
使用给定的参数执行它。
另一个BTW:除非你在外部模块内工作,否则不要写App::hashF
。您可以通过编写package App
或任何您喜欢的名称来声明当前的命名空间(应该与.pm文件的路径/名称相对应)。
答案 1 :(得分:3)
这个结构:
my $hash_funtion = {
'login' => OtherModule::login,
'logout' => Other2Module::logout
};
正在调用OtherModule::login
函数并将其返回值分配给$hash_funtion->{login}
,类似于logout
。您希望在散列值中存储对函数的引用:
my $hash_funtion = {
'login' => \&OtherModule::login,
'logout' => \&Other2Module::logout
};
然后其余的工作正常(假设您当然纠正了拼写错误)。