undefined < 0 möglich
romy
- perl
Guten Morgen,
da ich bisher Perl nur von Weitem gesehen habe und Google mir dazu nur Dinge ausspuckt, die mich noch mehr verwirren frage ich einfach mal: Wenn eine Variable den Wert undef. enthält (weil dies eine Funktion zurückgibt) und ich mache dann eine Abfrage if $var<0, wie ist dann das Ergebnis?
Weiss das Script dann, dass undef. < 0 ist odwer gibt es mir einen Fehler, weil es mit der Variablen gar nicht mehr arbeiten kann??? - was ich logisch fände.
vielen Dank
ciao
romy
Hallo Romy.
Wenn eine Variable den Wert undef. enthält (weil dies eine Funktion zurückgibt) und ich mache dann eine Abfrage if $var<0, wie ist dann das Ergebnis?
Das Ergebnis ist Wahr im Sinne von Bedingung erfüllt, allerdings solltest du eine Warnung erhalten:
http://www.perldoc.com/perl5.8.4/pod/perldiag.html#Use-of-uninitialized-value%25s
Perl bietet dir statt dessen die Funktion defined() an:
if(defined $var) { print "Die Variable hat den Wert $var"; }
Siehe auch http://www.perldoc.com/perl5.8.4/pod/perldata.html#Scalar-values bzw. http://de.selfhtml.org/cgiperl/funktionen/kontrolle.htm#defined.
Freundschaft!
Siechfred
Hi,
danke, diese Abfrage läuft in einem Perlscript von 1998, mittlerweile gibt es logischerweise neuere Libs und dort wird die Abfrage auch mit defined gemacht.
Ich habe nur gerade Logdateien vor mir mit Fehlern, die auf Perlscipt verweisen und ich versuche gerade rauszufinden, wo könnte der Teufel im Detail stecken.
Nun gut, wenn ich Dich richtig verstehe, sollte eigentlich die Abfrage klappen, dann ist dies nicht die Fehlerquelle, schade eigentlich.
vielen Dank
ciao
romy, suchenderweise (Heunadel und Steckhaufen)
Hallo Romy.
Ich habe nur gerade Logdateien vor mir mit Fehlern, die auf Perlscipt verweisen und ich versuche gerade rauszufinden, wo könnte der Teufel im Detail stecken.
Dann poste doch mal die Fehlermeldungen (in perldiag bist du nicht fündig geworden?).
Freundschaft!
Siechfred
Hi Siechfried,
Dann poste doch mal die Fehlermeldungen (in perldiag bist du nicht fündig geworden?).
doch, jetzt schon, er sagt, dasselbe, was Du schon sagtest, nämlich, dass dies eine Warnung ist und kein Fehler.
der Fehler im Log lautet:
uninitialized value at Blubberkram Line 51,52,53 in einer Endlosschleife. immer wieder dieser Fehler, abwechselnd in 51,52,53, was logisch ist.
Blubberkram:
while($sent > 0) {
my $n = syswrite($data, $buf, $sent,$off);
51 return $n if $n < 0;
52 $sent -= $n;
53 $off += $n;
}
deswegen meine Vermutung, n ist uninitialisiert, wenn undefined vom Syswrite weitergegeben wird, weil es fehlschlägt.
Dieser Auszug stammt aus einer Lib, die wie gesagt sehr alt ist.
ich kann leider kaum Angaben dazu machen, da ich nur versuche, jemanden zu helfen, ich kenne weder die Scripte noch Perl an sich etc.
ich versuche nur gerade die Ursachen etwas einzuschränken.
danke
ciao
romy
der Fehler im Log lautet:
uninitialized value at Blubberkram Line 51,52,53 in einer Endlosschleife. immer wieder dieser Fehler, abwechselnd in 51,52,53, was logisch ist.
Blubberkram:
while($sent > 0) {
my $n = syswrite($data, $buf, $sent,$off);
51 return $n if $n < 0;
52 $sent -= $n;
53 $off += $n;
Wenn $n undefiniert ist, ist es nicht kleimner als 0, kann aber auch nicht von $sent abgezogen werden und nciht zu $off dazu addiert werden.
my $n = syswrite($data, $buf, $sent,$off);
51 return $n unless $n;
Ich vermute mal, das die Funktion beendet werden kann wenn nichts geschrieben wurde. Ansonsten:
51 return $n unless defined $n;
Falls $n auch den Wert 0 haben darf.
Struppi.
Hi,
Weiss das Script dann, dass undef. < 0 ist odwer gibt es mir einen Fehler, weil es mit der Variablen gar nicht mehr arbeiten kann??? - was ich logisch fände.
Perl tut soz. sein Bestes keine Fehler entstehen zu lassen. Die Philosophie die dahintersteckt ist neben "Perl ist dazu da den Job zu machen" eben auch dem Programmierer zu vertrauen statt ihn (oder besser die spaeteren Nutzer) mit Fehlermeldungen zu nerven.
Nach meiner Erfahrung ist das ganz OK, wenn ich nur an die halbwegs typsicheren M$-Entwicklertools und deren Meldefreudigkeit denke. :-(
Gruss,
Ludger
Hi Ludger,
Nach meiner Erfahrung ist das ganz OK, wenn ich nur an die halbwegs typsicheren M$-Entwicklertools und deren Meldefreudigkeit denke. :-(
das Problem ist m.E. nicht die Meldefreudigkeit, sondern die mangelnde Aussagekraft selbiger.
Fehlermeldungen, die Aussagekraft besitzen, sind sehr sehr hilfreich ;) da nehme ich auch mehr davon...
ciao
romy
da ich bisher Perl nur von Weitem gesehen habe und Google mir dazu nur Dinge ausspuckt, die mich noch mehr verwirren frage ich einfach mal: Wenn eine Variable den Wert undef. enthält (weil dies eine Funktion zurückgibt) und ich mache dann eine Abfrage if $var<0, wie ist dann das Ergebnis?
Weiss das Script dann, dass undef. < 0 ist odwer gibt es mir einen Fehler, weil es mit der Variablen gar nicht mehr arbeiten kann??? - was ich logisch fände.
Das kommt darauf an mit welchem Schalter du das Skript startest. Es ist auf jeden Fall empfehlenswert Perl mit Warnungen und strict zu starten, also die folgenden Zeilen am Anfang:
#!/usr/perl/bin -w
use strict;
Dann funktioniert der Vergleich mit undef nicht mehr. undef ist auf jeden Fall nicht kleiner null, sondern höchstens ungleich null. Wenn die Funktion undef im Fehlerfall zurückgibt und keine null im Erfolgsfall würde ein:
unless($var) { ... fehler }
reichen.
Gibt die Funktion undef im Fehlerfall und ansonsten einen beliebigen Wert (inkl. null) zurück, musst du:
unless(defined $var) { ... Fehler }
schreiben.
Struppi.