无法在由Perl RPC::Serialized::Server::NetServer::Single创建的套接字中使用子例程名称

无法在由Perl RPC::Serialized::Server::NetServer::Single创建的套接字中使用子例程名称,perl,serversocket,Perl,Serversocket,我想使用Perl模块,并将其封装到一个独立的套接字中,该套接字将把模块中的子例程发布到其他程序中。但是,我可能无法克服名称空间问题,因为在客户端脚本中,我仍然收到一条错误消息: RPC::Serialized::X::Application\',\'MESSAGE\'=>\'没有用于'predejPOS'的处理程序 我的服务器脚本: use RPC::Serialized::Server::NetServer::Single; use RPC::Serialized::Handler::Hash

我想使用Perl模块,并将其封装到一个独立的套接字中,该套接字将把模块中的子例程发布到其他程序中。但是,我可能无法克服名称空间问题,因为在客户端脚本中,我仍然收到一条错误消息: RPC::Serialized::X::Application\',\'MESSAGE\'=>\'没有用于'predejPOS'的处理程序

我的服务器脚本:

use RPC::Serialized::Server::NetServer::Single;
use RPC::Serialized::Handler::HashTree;

my $s = RPC::Serialized::Server::NetServer::Single->new({
    net_server => {log_file => '', port => 20203 },
    rpc_serialized => {handler_namespaces => ''},
});

$s->run;
我的客户端脚本:

use RPC::Serialized::Client::INET;

my $client = RPC::Serialized::Client::INET->new({
  io_socket_inet => {PeerAddr  => '127.0.0.1', PeerPort => 20203,}
});

my $result = $client->predejPOS('flu-like');
我的模块(HastTree.pm):

package-RPC::Serialized::Handler::HashTree;
要求出口商;
@ISA=qw(出口商);
@出口=qw(预出口);
使用基“RPC::Serialized::Handler”;
我们的$VERSION='0.01';
子predejPOS{
我的%POS;
$POS{'flu-like'}='';
返回$POS{$\[0]};
};
1.
我使用的是Windows7和Perl5.12.3,模块位于正确的地址 (C:\PROGS\草莓\perl\site\lib\RPC\Serialized\Handler)。predejPOS函数在服务器脚本中被识别(即,我可以从中打印其结果),但我无法通过客户机-服务器通信访问它。我假设这与调用函数和调用方法之间的细微差别有关。我担心这可能是一件简单的事情,但即使经过大量的努力和谷歌搜索,我还是无法让它工作


提前谢谢

对于对象方法,第一个参数始终是当前对象实例本身。抱歉,如果我不够清楚,请尝试从以下示例中找出区别:

试试这个:

sub predejPOS {
  my $self = shift; 
  my $key  = shift; 
  my %POS;
  $POS{'flu-like'}='<JJ>';
  return $POS{$key};
};
sub-predejPOS{
我的$self=shift;
我的$key=shift;
我的%POS;
$POS{'flu-like'}='';
返回$POS{$key};
};

我最终自己解决了这个问题:

首先,我完全误解了调用函数的概念——在网络上,您只能调用所谓的RPC处理程序。此外,对于每个处理程序,RPC::Serialized::handler目录中必须有一个具有相同名称的模块和一个特定结构,其中只有一个名为invoke()的子例程。因此,我将我的模块(现在命名为'PredejPOS.pm')更改为:

package-RPC::Serialized::Handler::PredejPOS;
{
$RPC::Serialized::Handler::PredejPOS::VERSION='0.01';
}
严格使用;
使用警告致命=>“全部”;
使用基“RPC::Serialized::Handler”;
子调用{
我的$self=shift;
我的$key=shift;
我的%POS;
$POS{'flu-like'}='';
返回标量$POS{$key};
}
1.
但它仍然不起作用。 最后,我发现在Windows环境下,Perl Data::Serialize模块不能正常工作。 在Serialized.pm包的子例程recv(第115行)中,chomp不会删除以“\cM”结尾的该死的Windows行。当我纠正它时,它开始按设想工作。实际上,这里对这种行为有一个冗长的讨论()


谢谢你的建议。

不,这不是问题所在。我可能没有按照纯Perl的传统编写子例程,但函数调用在服务器脚本内部工作(如果我按照您的方式修改它,它将停止工作)-作为服务器脚本的一部分,我可以打印predejPOS('flu-like'),它将正确打印“”。
sub predejPOS {
  my $self = shift; 
  my $key  = shift; 
  my %POS;
  $POS{'flu-like'}='<JJ>';
  return $POS{$key};
};
package RPC::Serialized::Handler::PredejPOS;
{
  $RPC::Serialized::Handler::PredejPOS::VERSION = '0.01';
}

use strict;
use warnings FATAL => 'all';

use base 'RPC::Serialized::Handler';

sub invoke {
    my $self = shift;
    my $key = shift;

    my %POS;
    $POS{'flu-like'}='<JJ>';

    return scalar $POS{$key};
}

1;