Почему 'undef' не обнаружен этим фрагментом Perl? - PullRequest
2 голосов
/ 09 мая 2009

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

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

ура

Ответы [ 3 ]

7 голосов
/ 09 мая 2009

Уменьшено до минимума, печатается «обнаружен неопределенный».

#!/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, даже если вы думаете, что это так.

2 голосов
/ 09 мая 2009

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

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

1 голос
/ 09 мая 2009

Используйте отладчик perl (perl -d), чтобы просмотреть код и посмотреть, что происходит. При отладке кода важно освободить свой разум от каждого предположения.

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

use strict;
use warnings;
...