0

我尝试在 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);
}

但我得到如下错误: - 不能使用字符串(“登录”)作为子程序引用,而“严格引用” - 不能使用裸字(“OtherModelo”)作为哈希引用,而“严格引用”

4

2 回答 2

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无缘无故地执行。)

顺便说一句:哈希只能保存标量值,并且(代码)引用是一种标量。

当我们想从哈希中调用我们的 sub 时,我们必须使用解引用操作符 ->$hash->{$module}将代码引用作为值返回;->(@arglist)使用给定的参数执行它。

App::hashF另一个顺便说一句:除非您在外部模块中工作,否则不要写。您可以通过编写package App或任何您喜欢的名称来声明您当前的命名空间(应与 .pm 文件的路径/名称相对应)。

于 2012-07-29T20:24:45.293 回答
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
};

然后其余的将正常工作(当然假设您纠正了错别字)。

于 2012-07-29T20:22:39.463 回答