【问题标题】:Why is 'undef' not detected by this Perl fragment?为什么这个 Perl 片段没有检测到“undef”?
【发布时间】: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”(又名“使用警告;”)。

标签: perl undef


【解决方案1】:

使用perl debugger (perl -d) 单步执行代码以查看发生了什么。在调试代码时,重要的是要让你的头脑从每一个假设中解放出来。

此外,这些行是每个 perl 程序必须的:

use strict;
use warnings;

【讨论】:

    【解决方案2】:

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

    #!/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】:

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

      第一条日志消息有没有可能来自应用程序中其他地方的方法调用?

      【讨论】:

        猜你喜欢
        • 2011-04-30
        • 1970-01-01
        • 2020-12-12
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 1970-01-01
        相关资源
        最近更新 更多