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 Handlersしか呼び出すことができません。さらに、ハンドラーごとに、RPC::Serialized::Handler ディレクトリに同じ名前のモジュールと、invoke() と呼ばれるサブルーチンを 1 つだけ持つ特定の構造が必要です。したがって、モジュール (現在は「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 は '\cM' で終わる忌まわしい Windows 行を削除しません。修正したところ、想定どおりに動作するようになりました。実際、この動作についてはここで長い議論があります ( 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 に答える