代码之家  ›  专栏  ›  技术社区  ›  Rob Wells

为什么这个perl片段没有检测到“undef”?

  •  2
  • Rob Wells  · 技术社区  · 15 年前

    我希望在第二条“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的当前值,该值是一个全局变量,始终用于捕获返回值。
    • 我删减了日志信息,错过了额外的“后退”

    感谢您的建议和意见。我没有注意到日志时间戳中的6秒差异,所以现在我怀疑您对执行序列与我最初期望的不同的看法是正确的。

    我再回去看看。当你试图完成一个“星期一必须上线”的项目13小时后,看看别人的“平均”Perl时,你会得到这样的结果。

    我没有写代码,只是继承了它。这段代码是由一些人编写的,他们认为自己“不需要严加警告”。

    想象一下800行Perl和许多“ifs”,但没有其他语句!根本没有防御性编码!8- O

    再次感谢你的帮助。

    干杯,

    3 回复  |  直到 15 年前
        1
  •  2
  •   Jonathan Rupp    15 年前

    我认为这里正在发生更复杂的事情——这些日志消息似乎相隔6秒,对于push语句、返回和if检查,不可能需要6秒。

    第一条日志消息是否来自应用程序中其他位置对方法的以前调用?

        2
  •  7
  •   Jonathan Leffler    15 年前

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

    #!/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,即使您认为它应该返回。

        3
  •  1
  •   amarillion    15 年前

    使用 perl debugger (perl-d)单步执行代码以查看发生了什么。在调试代码时,重要的是要使您的思想不受任何假设的影响。

    此外,这些行必须位于每个Perl程序之上:

    use strict;
    use warnings;