【发布时间】:2010-10-25 00:16:13
【问题描述】:
由于 undef 值,我希望输入第二个“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 的当前值,它是一个始终用于捕获返回值的全局变量。
- 我减少了日志消息,错过了额外的“后退”
感谢您的建议和 cmets。我没有注意到日志时间戳的六秒差异,所以现在我怀疑您对执行顺序与我最初预期的不同是正确的。
我会回去再看一遍。猜猜这就是你在一天 13 个小时试图完成一个“必须在星期一上线”项目之后查看其他人的“平均”Perl 时得到的结果!
我没有编写代码,只是继承了它。代码是由几个认为自己“不需要警告或严格”的人编写的。
想象一下 800 行 Perl 和大量的“if”,但没有 else 语句!根本没有防御性编码! 8-O
再次感谢您的帮助。
干杯,
【问题讨论】:
-
只是一件小事:时间戳的差异让我怀疑在调用 getcmd() 和第二条日志语句之间实际上有更多代码——代码与您提供的完全一样吗?
-
我对使用 $ret 而不是在 getcmd 中声明感到困惑。它在 if/else 中的实际值是多少?
-
第一条日志消息不是来自您显示的 getcmd 函数;消息说“返回”,而代码没有。
-
@Anonymous:$ret 可能是一个包或全局变量。可能是代码未在“使用严格;”下运行和“-w”(又名“使用警告;”)。