将函数指针作为散列的一部分,perl

时间:2016-10-31 17:56:24

标签: perl class pointers

脚本运行使用户定义了一些功能:

sub userFunction
{
 my ($msg, $id) = @ARG;
 # do things
}

这个函数$ func以特定的消息名称$ msg传递到我的类中,并存储为{_Handles}中的$ msg / $ userFunc对:

sub new
{
  my ($class, ...) = @_;
  my $self = {};
  $self->{_Handles} = {};
  .
  . 
  .
}

然后我添加一个消息处理程序:

$Class->AddMsgHandler($msgName1, \&userFunction);
sub AddMsgHandler
{ 
  my ($self, $msg, $func) = @ARG;
  my $funcPtr = $func->();
  $self->{_Handles}{'msg'} = $msg;
  $self->{_Handles}{$msg}{'funcPtr'} = $funcPtr;
}

目的是通过设备无线传输我的信息;另一台设备将收到此消息。假设设备在另一个函数中接收消息,我试图在特定的$ id上调用用户定义的函数,如下所示:

sub Receive
{
 .
 .
 .
 my $funcPtr = $self->{_Handles}{$msg}{'funcPtr'};
 $funcPtr->($msg, $self->{_devices}{$id});
} 

某种程度上没有回应。也许我误用了函数指针?

2 个答案:

答案 0 :(得分:5)

执行此操作时:my $funcPtr = $func->();,您正在执行子例程并将函数的返回值赋给$funcPtr,而不是函数的代码引用本身,我认为这就是您所追求的。您需要从该作业中删除->()。这是一个简短的例子:

use warnings;
use strict;

my %store;

sub user_func {
    return 5;
}
sub set {
    my $func = shift;
    $store{func} = $func;
}

set(\&user_func);

print $store{func}->();

以下是一个显示差异的示例:

sub func {
    return 5;
}

my $cref = \&func;

my $called = $cref->();
my $not_called = $cref;

print "$called\n";
print "$not_called\n";

输出:

5
CODE(0x801c82ed0)

答案 1 :(得分:0)

显然,最好的帮助是指导您调试自己的代码。您可以使用 -d 标志打开Perl调试器,以便您可以停止执行代码以确保:

  1. 您确实存储了子参考
  2. 你真的正在恢复并称之为
  3. 说出来,我会打开我的快速解决方案:

    而不是

    $funcPtr->($msg, $self->{_devices}{$id});
    

    <强>尝试

    &$funcPtr($msg, $self->{_devices}{$id});
    
相关问题