2

我想使用 Perl 模块并将其包装到一个独立的套接字中,该套接字会将子例程从模块发布到其他程序。但是,我可能无法克服命名空间问题,因为在客户端脚本中,我仍然收到一条错误消息: RPC::Serialized::X::Application\',\'MESSAGE\' => \'No handler for '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;

require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(predejPOS);

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

our $VERSION = '0.01';

sub predejPOS {
  my %POS;
  $POS{'flu-like'}='<JJ>';
  return $POS{$_[0]};
};

1;

我使用的是 Windows 7,Strawberry Perl 5.12.3,并且模块位于正确的地址 (C:\PROGS\Strawberry\perl\site\lib\RPC\Serialized\Handler)。函数 predejPOS 在服务器脚本中被识别(即我可以从中打印它的结果),但我无法通过客户端-服务器通信访问它。我认为这与调用函数和调用方法之间的细微差别有关。恐怕这可能很简单,但即使经过大量的努力和谷歌搜索,我也无法让它发挥作用。

提前致谢!

4

2 回答 2

1

好吧,我最终自己解决了它:

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

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;

但它仍然无法正常工作。最后其次我发现在Windows环境下,Perl Data::Serialize模块不能正常工作。在包 Serialized.pm 的子程序 recv(第 115 行)中,chomp 不会删除该死的 Windows 行结尾“\cM”。当我纠正它时,它开始按预期工作。实际上这里有一个关于这种行为的冗长讨论(http://www.perlmonks.org/?node_id=549385

感谢您的建议。

于 2012-12-05T15:36:13.207 回答
0

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

尝试这个:

sub predejPOS {
  my $self = shift; 
  my $key  = shift; 
  my %POS;
  $POS{'flu-like'}='<JJ>';
  return $POS{$key};
};
于 2012-12-04T08:50:33.153 回答