Pergunta

Eu esperaria o bloco no segundo 'if' para ser introduzido por causa do valor undef mas os registros mostram que ele não está sendo introduzido.

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()"];
}

Os shows de arquivo de log:

[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()

Todas as ideias muito agradecido aceitou.

Editar: Desculpe, eu tinha editado para baixo o código para mostrar o fluxo básico. Eu deveria ter corrigi-la um pouco melhor.

  • Eu adicionei o $ ret em getcmd () para simular o que acontece na função de registro que apenas imprime o valor atual de $ ret que é uma variável global sempre usado para valores de retorno de captura.
  • Eu aparadas para baixo as mensagens de log e perdeu o "back" extra

Obrigado pelas sugestões e comentários. Eu não tinha notado os seis segunda diferença no log timestamps então agora eu suspeito que você está certo sobre a seqüência de execução ser diferente do que eu esperava originalmente.

Eu vou voltar e olhar novamente. Acho que é o que você ganha quando se tenta olhar para outra pessoa "média" Perl depois de um dia 13 horas tentando fazer as coisas acabados para um "deve ir ao vivo na segunda-feira" projeto!

Eu não escrevi o código e simplesmente herdou. O código foi escrito por um par de pessoas que pensam que não "necessidade não steenking avisos ou stricts".

Imagine que 800 linhas de Perl e muitos 'ses' mas não else! Sem codificação em tudo na defensiva! 8-O

Uma vez obrigado pela sua ajuda.

aplausos,

Foi útil?

Solução

Eu acho que algo mais complicado está acontecendo aqui - essas mensagens de log parecem ser de 6 segundos de diferença, e não há nenhuma maneira levaria 6 segundos para a instrução empurrão, o retorno, e a se verificar.

Qualquer chance que a primeira mensagem de registro foi de uma chamada anterior do método de algum outro lugar no aplicativo?

Outras dicas

Reduzido ao mínimo, este imprime "undef detectado".

#!/bin/perl -w

use strict;

sub getcmd
{
    return undef;
}

my $ret;

if (!($ret = getcmd()))
{
    print "undef detected\n";
}
else
{
    print "undef undetected\n";
}

Por isso, o problema é mais provável que os US $ self-> getcmd () não está retornando undef, mesmo que você acha que deveria.

Use perl depurador (perl -d) para percorrer o código para ver o que é indo. Quando a depuração do código, é importante para libertar sua mente de cada suposição.

Além disso, estas linhas são uma obrigação acima de qualquer programa de perl:

use strict;
use warnings;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top