为什么这个Perl片段没有检测到'undef'?

时间:2009-05-09 14:19:27

标签: perl undef

我希望输入第二个'if'语句中的块是因为undef值,但是日志显示它没有被输入。

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的当前值,这是一个总是用来捕获返回值的全局变量。
  • 我已经删除了日志消息,错过了额外的“后退”

感谢您的建议和意见。我没有注意到日志时间戳中的六秒差异所以现在我怀疑你对执行顺序与我原先预期的不同是正确的。

我会回去看看。猜猜这是你在13个小时后尝试查看其他人的“普通”Perl时得到的结果,试图让“周日必须上线”项目完成任务!

我没有编写代码而只是继承了它。该代码是由一些人认为他们“不需要任何警告或严格警告”而编写的。

想象一下800行的Perl和许多'ifs',但没有其他声明!完全没有防御性编码! 8-O

再次感谢您的帮助。

欢呼声,

3 个答案:

答案 0 :(得分:7)

减少到最低限度,打印“未检测到”。

#!/bin/perl -w

use strict;

sub getcmd
{
    return undef;
}

my $ret;

if (!($ret = getcmd()))
{
    print "undef detected\n";
}
else
{
    print "undef undetected\n";
}

因此,您的问题很可能是$ self-> getcmd()没有返回undef,即使您认为它应该。

答案 1 :(得分:2)

我认为这里发生了一些更复杂的事情 - 这些日志消息似乎相距6秒,并且推送语句,返回和if检查都不会花费6秒钟。

第一条日志消息是否有可能来自之前从应用程序中其他位置调用该方法?

答案 2 :(得分:1)

使用perl debugger(perl -d)逐步执行代码以查看发生了什么。在调试代码时,重要的是让你的思想摆脱每一个假设。

此外,这些行必须高于每个perl程序:

use strict;
use warnings;