2009-05-09 2 views
2

Я бы ожидал, что блок во втором выражении «если» будет введен из-за значения undef, но журналы показывают, что он не вводится.Почему 'undef' не обнаружен этим фрагментом Perl?

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 после тринадцатичасового дня, пытаясь закончить работу над проектом «must go live on Monday»!

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

Представьте себе 800 строк Perl и много «ifs», но никаких других заявлений! Никакой защитной кодировки вообще! 8-O

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

веселит,

+1

Просто небольшая вещь: разница в отметках времени заставляет меня подозревать, что на самом деле там гораздо больше коды между вызовом getcmd() и 2-й оператор журнала - это код именно так, как вы его представили? –

+1

Я запутался в использовании $ ret и не объявлен в getcmd. И какова его фактическая ценность в if/else? – Anonymous

+2

Первое сообщение журнала не поступало из функции getcmd, которую вы показываете; в сообщении говорится «назад», а код - нет. –

ответ

1

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

Любое случайное появление первого сообщения журнала из предыдущего вызова метода из другого места в приложении?

7

Пониженный до минимума, он печатает «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() не возвращает неопределенное значение, даже если вы думаете, что должен.

1

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

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

use strict; 
use warnings;