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

标签 perl undef

由于 undef 值,我希望第二个“if”语句中的 block 被输入,但日志显示它没有被输入。

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

最佳答案

减少到最低限度,打印“undef detected”。

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

关于perl - 为什么这个 Perl 片段没有检测到 'undef'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843405/

相关文章:

html - 如何在 Perl 中删除每三个 HTML 标记?

perl - 如何删除多个文件中的重复行?

perl - 在 Perl 中导出变量是一种好习惯吗?

c++ - 宏定义未按预期替换?

tcl - 如何删除 Tcl 过程?

c++ - 我们什么时候需要在#undef 之前使用#ifdef?

c#取消定义所有参数的快速方法

mysql - 使用 Perl DBIx 在运行时设置 MySQL 时区

用于大型数据集的 Perl 缓存库?