如何从perl中的hash调用函数

时间:2012-07-29 20:15:15

标签: perl

我试图在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”

2 个答案:

答案 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
};

然后其余的工作正常(假设您当然纠正了拼写错误)。