Perché 'undef' non viene rilevato da questo frammento Perl?
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,
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;