私はコードに詳しくありませんが、XML::Stream のその行は、モジュールが select() ループを開始する場所です。行 523-524 は、宛先サーバーに IO::Select ソケットを渡す場所であり、IO::Select 自体は、XML::Stream が使用する方法で undef であってはならない、祝福された参照を渡します。
何かが Jabber モジュールの XML::Stream オブジェクトの「SELECT」要素を変更している可能性があります。これは、サーバー接続エラーを修正するための誤った試みである可能性があります。詳しく言えなくてすみません。
更新に応じて:
これらは奇妙なエラーであり、とにかく Jabber モジュールの内部を調べるつもりだったので、ソースを調べました。以下は、CPAN から入手できる、使用されているモジュールの最新バージョンを参照することに基づいています。これらのモジュールのサブクラス化を開始し、コードを追加して予期しないことがどこで発生するかを確認したい場合を除き、これはおそらくあまり役に立ちません。(Jabber モジュールの内部に興味がない場合は、次の段落をスキップできます。)
更新された情報から、41 行目で Authen::SASL::Perl が鳴っている箇所までたどりました。これには $parent->mechanism からの結果が必要であり、Authen::SASL が無効であると仮定すると、2 つの原因が考えられます。壊れていません。Net::XMPP::Protocol (行 2968) から引数なしで誤って呼び出されているか、Authen::SASL のコンストラクターで設定された「メカニズム」が存在しないかのいずれかです。Net::XMPP::Protocol は、"メカニズム" (GetStreamFeature が呼び出された、行 2958、行 3340 付近で定義されたメソッド) を で定義します。return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);
$feature は、呼び出し先から渡された単なる文字列であり、XML::Stream オブジェクトの ID 部分です。セッション。
元の XML エラーと、セッション ID が悪くなる可能性に基づいて、サーバーが XML::Stream に予期せず、それを使用するモジュールによって説明されていないある時点で不良データを送信するようです。foo%40gmail.com@talk.google.com が正しいユーザー名形式であるとは確信していませんが、Jabber サーバーが何か問題を起こしていない限り、これらのエラーがどのように発生するのかわかりません。
別のサーバーで別のユーザー名を使用して新たに開始し、Jabber::SimpleSend がまったく機能するかどうかを確認してから、何らかの方法でサーバーの出力をキャプチャして、XML::Stream が何を詰まらせているかを確認します。
更新:価値があるので、モジュールをインストールしましたが、まったく同じエラーが発生しています。Authen::SASL::Perl::PLAIN および他のすべての前提条件が存在します。そして、ユーザー名を gmailaccountname@talk.google.com に設定し、グローバル警告 (例: #!/usr/bin/perl -w または perl -w filename.pl) を有効にすると、XML::Stream は一連の未定義のメッセージを明らかにします。値の問題で、SimpleSend は実際に「Jabber サーバーに接続できませんでした」という警告を吐き出します。(いいえ、それが実際に何を意味するのかわかりません:()。
更新: Net::Jabber::Bot をインストールしようとしていた (いくつかの ssl モジュール エラーの後で断念した) それが何かを解決するかどうかを確認するために、そのコンストラクターにこのオプションとメモがあることに気付きました:
gtalk => 0 # Default to off, 1 for on. needed now due to gtalk differences from std jabber server.
これは、サーバーが異常なことをしているという考えを補強しますが、XML::Stream はわざわざ例外をスローしません。