为什么这个Perl片段检测不到“undef”?

qmelpv7a  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(121)

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

感谢您的建议和意见。我没有注意到日志时间戳中的6秒差异,所以现在我怀疑您是对的,执行顺序与我最初预期的不同。
我会回去再看一遍。我猜这就是你在一天13个小时试图完成一个“周一必须上线”的项目后,试图查看别人的“平均”Perl时得到的结果!
我没有写代码,只是简单地继承了它。代码是由几个人写的,他们认为他们不需要“不需要steenking警告或限制”。
想象一下,800行Perl和大量的“if”语句,但没有else语句!根本没有防御性编码!8-O

q5lcpyga

q5lcpyga1#

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

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

w41d8nur

w41d8nur2#

我认为这里发生了更复杂的事情--这些日志消息似乎相隔6秒,而push语句、return和if检查不可能花费6秒。
第一条日志消息是否可能来自应用程序中其他位置对该方法的上一次调用?

bfnvny8b

bfnvny8b3#

使用perl debugger(perl -d)来逐步执行代码,看看发生了什么。调试代码时,重要的是要把你的头脑从每一个假设中解放出来。
此外,在每个perl程序上都必须有以下代码行:

use strict;
use warnings;
gev0vcfq

gev0vcfq4#

测试$var是否为undef的正确方法是而不是if (!$var) ...,因为该测试对于$var = ''$var = 0也为真。请改用if (!defined $var) ...
可能是这样的(显示所有相关案例):

if (!defined $var) {
    # not defined ...
} elsif ($var) {
    # defined and true...
} else {
    # defined and false
}

相关问题