Я бы ожидал, что блок во втором выражении «если» будет введен из-за значения 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
Еще раз спасибо за помощь.
веселит,
Просто небольшая вещь: разница в отметках времени заставляет меня подозревать, что на самом деле там гораздо больше коды между вызовом getcmd() и 2-й оператор журнала - это код именно так, как вы его представили? –
Я запутался в использовании $ ret и не объявлен в getcmd. И какова его фактическая ценность в if/else? – Anonymous
Первое сообщение журнала не поступало из функции getcmd, которую вы показываете; в сообщении говорится «назад», а код - нет. –