Perl 调试:设置为“1”的变量意外设置为“undef”

Perl debugging: Variable being set to `1` is set to `undef` unexpectedly

注意:请仔细阅读;这很奇怪(除非我眼睛上有西红柿)

我正在更改我的程序,但它突然停止按预期工作,我没能找到原因。 最终我找到了它;请考虑这个 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 ref(如所见)。 然而在该行被执行之后(由 n),$result 的值是 undef,而不是 1(紧接在 if-else 块,因此几行之后)。

由于将返回结果,调用者看到错误的结果值并失败。

不幸的是,我或 Perl 都非常困惑。 谁能解释一下?

西红柿掉了我的眼睛! (我提供这个答案而不是删除问题,以防万一有人看到类似的问题)

代码基本上是:

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;
}

所以错误是:“my 太多了”(在 if 中)。