Domanda

Mi aspetto che il blocco nella seconda istruzione 'if' venga inserito a causa del valore undef ma i registri mostrano che non è stato inserito.

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

Il file di registro mostra:

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

Tutte le idee sono state accettate con gratitudine.

Modifica: Spiacente, ho modificato il codice per mostrare il flusso di base. Avrei dovuto correggerlo un po 'meglio.

  • Ho aggiunto $ ret in getcmd () per simulare ciò che accade nella funzione di registrazione che stampa semplicemente il valore corrente di $ ret, che è una variabile globale utilizzata sempre per acquisire valori di ritorno.
  • Ho eliminato i messaggi di registro e ho perso il " indietro "

Grazie per i suggerimenti e i commenti. Non avevo notato la differenza di sei secondi nei timestamp del log, quindi ora sospetto che tu abbia ragione sul fatto che la sequenza di esecuzione è diversa da quella che mi aspettavo inizialmente.

Tornerò indietro e guarderò di nuovo. Immagino che sia quello che ottieni quando cerchi di guardare il & Quot di qualcun altro; <<> medio quot; Perl dopo una giornata di tredici ore cercando di finire le cose per un & Quot; deve andare in diretta il lunedì & Quot; progetto!

Non ho scritto il codice e l'ho semplicemente ereditato. Il codice è stato scritto da un paio di persone che pensano di non & Quot; non hanno bisogno di avvertimenti o di restrizioni & Quot ;.

Immagina 800 righe di Perl e un sacco di 'ifs' ma nessun'altra affermazione! Nessuna codifica difensiva! 8-O

Ancora una volta grazie per l'aiuto.

applausi,

È stato utile?

Soluzione

Penso che stia succedendo qualcosa di più complicato: quei messaggi di registro sembrano essere distanti 6 secondi e non c'è modo che impieghino 6 secondi per l'istruzione push, il ritorno e il controllo if.

Qualche possibilità che il primo messaggio di registro provenisse da una precedente chiamata del metodo da qualche altra posizione nell'applicazione?

Altri suggerimenti

Ridotto al minimo indispensabile, stampa " undef rilevato " ;.

#!/bin/perl -w

use strict;

sub getcmd
{
    return undef;
}

my $ret;

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

Di conseguenza, molto probabilmente il tuo problema è che $ self - > getcmd () non sta restituendo undef, anche se pensi che dovrebbe.

Usa debugger perl (perl -d) per scorrere il codice per vedere cos'è sta succedendo. Quando esegui il debug del codice, è importante liberare la mente da ogni presupposto.

Inoltre, queste righe sono un must sopra ogni programma perl:

use strict;
use warnings;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top