Почему «undef» не обнаруживается этим фрагментом Perl?

StackOverflow https://stackoverflow.com/questions/843405

  •  20-08-2019
  •  | 
  •  

Вопрос

Я ожидал бы, что блок во втором операторе 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()

Любые идеи принимаются с благодарностью.

Редактировать: Извините, я отредактировал код, чтобы показать основной процесс.Мне следовало вычитать это немного лучше.

  • Я добавил $ret в getcmd(), чтобы имитировать то, что происходит в функции регистрации, которая просто распечатывает текущее значение $ret, которая является глобальной переменной, всегда используемой для захвата возвращаемых значений.
  • Я сократил сообщения журнала и пропустил дополнительное слово «назад».

Спасибо за предложения и комментарии.Я не заметил шестисекундной разницы во временных метках журнала, поэтому теперь подозреваю, что вы правы в том, что последовательность выполнения отличается от той, которую я изначально ожидал.

Я вернусь и посмотрю еще раз.Думаю, это то, что вы получаете, пытаясь взглянуть на чей-то «средний» Perl после тринадцатичасового рабочего дня, пытаясь закончить проект, который «должен быть запущен в понедельник»!

Я не писал код, а просто унаследовал его.Код был написан парой людей, которые думают, что им «не нужны никакие вонючие предупреждения или строгие ограничения».

Представьте себе 800 строк Perl и множество «если», но больше никаких операторов!Никакого защитного кодирования вообще!8-О

Еще раз спасибо за вашу помощь.

ваше здоровье,

Это было полезно?

Решение

Я думаю, что здесь происходит что-то более сложное - кажется, что эти сообщения журнала различаются с интервалом в 6 секунд, и нет никакой возможности, чтобы это заняло 6 секунд для оператора push, возврата и проверки if.

Есть ли шанс, что первое сообщение журнала было результатом предыдущего вызова метода из какого-то другого места приложения?

Другие советы

Сведенный к минимуму, это печатает «обнаружен undef».

#!/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 -d), чтобы просмотреть код и увидеть, что происходит.При отладке кода важно освободить свой разум от всех предположений.

Кроме того, эти строки являются обязательными для каждой программы на Perl:

use strict;
use warnings;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top