注意:請仔細閱讀;這很奇怪(除非我的眼睛上有西紅柿)
我正在更改我的程式,但它突然停止按預期作業,我找不到原因。最終我找到了它;請考慮這個 Perl 除錯器會話提取(Perl 5.18.2):
DB<8> x $result
0 undef
DB<9> c
main::receive_message(./syslogd.pl:1555):
1555: $result = 1;
DB<9> x $result
0 ARRAY(0x375cdb0)
0 IO::Socket::INET=GLOB(0x2f8aa20)
-> *Symbol::GEN3
FileHandle({*Symbol::GEN3}) => fileno(6)
1 SocketAddress=ARRAY(0x375d188)
0 'v04:36766'
1 'v04'
2 36766
3 ''
2 '<22>May 23 10:22:07 v04 postfix/cleanup[22002]: F26AB68046: message-id=<1653294126.782e1e75c78c74d3@v04>'
DB<10> n
main::receive_message(./syslogd.pl:1561):
1561: $lc->verbose(3, "$me: returning " . Class::_format_undef($result));
DB<10> x $result
0 undef
所以在第 1555$result行將設定為1(在if-else塊內)。之前$result是一個ARRAY參考(如所見)。然而,在該行執行后(by n),的值$result是undef,而不是1(在if-else塊之后,因此幾行之后)。
由于將回傳結果,呼叫者看到錯誤的結果值并失敗。
不幸的是,無論是我還是 Perl 都非常困惑。誰能解釋一下?
uj5u.com熱心網友回復:
西紅柿從我眼前掉了下來!(我提供這個答案而不是洗掉問題,以防萬一有人看到類似的問題)
代碼基本上是:
sub receive_message($$$$;$)
{
#...
my $result;
my $lc = $err_mh->log_config();
if (defined(my $result = $lsa->receive(undef, MAXLEN, $flags))) {
#...
$result = 1; # line 1555
} else {
#...
}
$lc->verbose(3, "$me: returning " . Class::_format_undef($result)); # line 1561
return $result;
}
所以錯誤是:“a mytoo much”(在 中if)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/484010.html
