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);
}

しかし、私は次のようなエラーを受け取ります:-「厳密な参照」中にサブルーチン参照として文字列(「ログイン」)を使用できません-「厳密な参照」中にハッシュ参照としてベアワード(「その他のモデル」)を使用できません

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);
}

そのままの名前を割り当てることはできませんが、コード参照を渡すことはできます。&シジルは「コード」タイプまたはサブルーチンを示し、それ\への参照を提供します。(参照を取得しないとコードが実行されます。私たちが望むものではありません。挑発されずに実行しないでください&subroutine。)

ところで: ハッシュはスカラー値のみを保持でき、(コード) 参照は一種のスカラーです。

ハッシュからサブルーチンを呼び出したい場合は、逆参照演算子 ->を使用する必要があります。 $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 に答える