2

undef値のため、2番目の'if'ステートメントのブロックが入力されると予想しますが、ログには入力されていないことが示されています。

sub getcmd{
  my $self = $_[0];
  if ( $self->_recv == OK ){
      push @{$self->{'log'}}, ['NOTICE', "OK"];
      return "My command";          
  }
  push @{$self->{'log'}}, ['ERROR', "Did not get OK back"];
  return undef;
}

...

if (!($ret = $self->getcmd)){
  push @{$self->{'log'}}, ['ERROR', "failed to read after asking for NEXT"];
}
else {
  push @{$self->{'log'}}, ['ERROR', "'undef' not detected in next()"];
}

ログファイルは次のことを示しています。

[Fri May  8 19:25:56 2009]: ERROR: Did not get OK back
[Fri May  8 19:26:02 2009]: ERROR: 'undef' not detected in next()

どんなアイデアもありがたく受け入れました。

編集:申し訳ありませんが、基本的なフローを表示するためにコードを編集しました。もう少し校正すべきだった。

  • getcmd()に$ retを追加して、戻り値をキャプチャするために常に使用されるグローバル変数である$retの現在の値を出力するロギング関数で何が起こるかをシミュレートしました。
  • 私はログメッセージを切り詰めて、余分な「戻る」を逃しました

提案とコメントをありがとう。ログのタイムスタンプに6秒の違いがあることに気づかなかったので、実行シーケンスが当初の予想とは異なっていることについては正しいと思います。

戻ってもう一度見てみます。「月曜日に稼働しなければならない」プロジェクトのために物事を終わらせようとして13時間の日を過ごした後、他の誰かの「平均的な」Perlを見ようとすると、それが得られると思います。

私はコードを書かず、単にそれを継承しました。このコードは、「厳しい警告や厳格さは必要ない」と考える数人の人々によって書かれました。

800行のPerlとたくさんの「ifs」を想像してみてください。elseステートメントはありません。防御的なコーディングはまったくありません!8-O

もう一度あなたの助けに感謝します。

乾杯、

4

3 に答える 3

1

perl デバッガー(perl -d) を使用してコードをステップ実行し、何が起こっているかを確認します。コードをデバッグするときは、あらゆる仮定から心を解放することが重要です。

また、これらの行はすべての perl プログラムの上で必須です:

use strict;
use warnings;
于 2009-05-09T15:58:41.197 に答える