Ple*_*xus 1 perl pointers class
该脚本运行使得USER定义了一些功能:
sub userFunction
{
my ($msg, $id) = @ARG;
# do things
}
Run Code Online (Sandbox Code Playgroud)
这个函数,$ func与一个特定的消息名称$ msg一起传递到我的类中,并存储为{_Handles}中的$ msg/$ userFunc对:
sub new
{
my ($class, ...) = @_;
my $self = {};
$self->{_Handles} = {};
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
然后我添加一个消息处理程序:
$Class->AddMsgHandler($msgName1, \&userFunction);
sub AddMsgHandler
{
my ($self, $msg, $func) = @ARG;
my $funcPtr = $func->();
$self->{_Handles}{'msg'} = $msg;
$self->{_Handles}{$msg}{'funcPtr'} = $funcPtr;
}
Run Code Online (Sandbox Code Playgroud)
目的是通过设备无线传输我的消息; 另一台设备将收到此消息.假设设备在另一个函数中收到消息,我试图在特定的$ id上调用用户定义的函数,如下所示:
sub Receive
{
.
.
.
my $funcPtr = $self->{_Handles}{$msg}{'funcPtr'};
$funcPtr->($msg, $self->{_devices}{$id});
}
Run Code Online (Sandbox Code Playgroud)
不知怎的,没有回应.也许我误用了函数指针?
当你这样做时: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}->();
Run Code Online (Sandbox Code Playgroud)
这是一个显示差异的示例:
sub func {
return 5;
}
my $cref = \&func;
my $called = $cref->();
my $not_called = $cref;
print "$called\n";
print "$not_called\n";
Run Code Online (Sandbox Code Playgroud)
输出:
5
CODE(0x801c82ed0)
Run Code Online (Sandbox Code Playgroud)