Frage

Ich würde den Block in dem zweiten erwarten ‚if‘ Anweisung wegen des undef Wertes eingegeben werden, aber die Protokolle zeigen, dass es nicht eingegeben wird.

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

Die Protokolldatei zeigt:

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

Alle Ideen dankbar angenommen.

Edit: Sorry, habe ich den Code bearbeiten bis die Grundströmung zu zeigen. Ich hätte es besser ein bisschen haben Korrektur lesen.

  • Ich habe die $ ret in getcmd () zu simulieren, was in der Logging-Funktion geschieht, die nur den aktuellen Wert von $ ret ausdruckt, die eine globale Variable ist immer verwendet, um Rückgabewerte zu erfassen.
  • habe ich die Log-Meldungen abgespeckte und verpasste die extra „zurück“

Vielen Dank für die Anregungen und Kommentare. Ich hatte die 6 Sekunden Differenz in den Protokollzeitstempel nicht bemerkt, so dass ich jetzt vermuten, dass Sie Recht, über die Ausführungssequenz sind unterschiedlich zu dem, was ich ursprünglich erwartet.

Ich gehe zurück und schauen wieder. Ich schätze, das ist, was Sie bekommen, wenn sie versuchen, „durchschnittlich“ Perl an jemand anderen zu suchen nach einem 13 Stunden Tag versucht, die Dinge für ein fertig zu bekommen Projekt „muss leben am Montag gehen“!

Ich habe nicht den Code schreiben und einfach geerbt. Der Code von ein paar Leuten geschrieben wurde, die denken, dass sie nicht „brauchen keine steenking Warnungen oder stricts“.

Stellen Sie sich vor 800 Zeilen Perl und viele ‚Wenns‘, aber keine anderen Aussagen! Keine defensive Codierung überhaupt! 8-O

Ein nochmals vielen Dank für Ihre Hilfe.

prost,

War es hilfreich?

Lösung

Ich denke, etwas komplizierter gehe hier - diese Protokollmeldungen 6 Sekunden zu sein scheinen auseinander, und es gibt keine Möglichkeit, es 6 Sekunden für die Push-Anweisung übernehmen würde, die Rückkehr und der if-Check.

Jede Chance, die erste Protokollnachricht von einem vorherigen Aufruf der Methode von einem anderen Ort in der Anwendung war?

Andere Tipps

Reduziert auf ein absolutes Minimum, diesen Druck "undef erkannt".

#!/bin/perl -w

use strict;

sub getcmd
{
    return undef;
}

my $ret;

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

Folglich Ihr Problem ist sehr wahrscheinlich, dass die Selbst $> getcmd () Rückkehr nicht undef, auch wenn Sie denken, es sollte.

Verwenden Sie Perl-Debugger (perl -d) durch den Code zu Schritt, um zu sehen, was ist geht. Wenn Code debuggen, ist es wichtig, Ihren Geist von jeder Annahme zu befreien.

Außerdem sind diese Linien ein Muss über jedes Perl-Programm:

use strict;
use warnings;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top