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
中)。
注意:请仔细阅读;这很奇怪(除非我眼睛上有西红柿)
我正在更改我的程序,但它突然停止按预期工作,我没能找到原因。 最终我找到了它;请考虑这个 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
中)。