我想调用一个动态调度其他函数的主控制器函数,如下所示:
package Controller; my %callback_funcs = (); sub register_callback{ my ($class,$callback,$options) = _@; #apppend to %callback_funcs hash ... ? } sub main{ %callback_funcs = ( add => 'add_func',rem => 'remove_func',edit => 'edit_func'); while(<STDIN>){ last if ($_ =~ /^\s*$/); if($_ == 'add' || _$== 'rem' || _$== 'edit'){ $result = ${callback_funcs['add']['func']}(callback_funcs['add']['options']); } } } sub add_func{ ... }
需要注意的是,subs是在其他模块中定义的,因此回调必须能够引用它们……加上
我很难让哈希合适!
解决方法
因此,可以使用包含可以从stdin调用的匿名子例程的哈希.
my %callbacks = ( add => sub { # do stuff },fuzzerbligh => sub { # other stuff },);
您可以在哈希中插入更多哈希值:
$callbacks{next} = sub { ... };
你会调用这样一个
$callbacks{next}->(@args);
要么
my $coderef = $callbacks{next}; $coderef->(@args);
您可以从STDIN或其他任何地方获取哈希键.
您也可以非自然地定义它们,然后引用它们.
sub delete { # regular sub definition } $callbacks{delete} = \&delete;
但是,我不打算称这些回调.回调是在另一个子例程返回后调用的子函数.
您的代码也充斥着语法错误,这可能会掩盖这里的深层问题.我还不清楚你在尝试使用第二级数组做什么.你什么时候定义这些潜艇,谁在什么时候使用它们?