Schrift
[thread]11235[/thread]

redo erzeugt Endlosschleife (war: Ich find den Fehler nicht!!!)

Leser: 2


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
pl
 2008-02-03 13:03
#105495 #105495
User since
2007-06-05
26 Artikel
BenutzerIn
[default_avatar]
Ich find den Fehler im Code einfach nicht, @letters sollte nur ausgegeben werden wenn $ai den gleichen Wert wie $zeitspanne hat, stattdessen wird er tausende male ausgegeben.
Die Datei "/home/jakob/ai" sieht folgendermaßen aus:
Code: (dl )
2:3:4


Das eigentliche Codestück so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub ai {
open AI, "/home/jakob/ai" or die "Kann Dateihandle nicht öffnen: $!";
my $ai = <AI>;
my @ai = split /:/, $ai;
my $zeit1 = time();
foreach $ai (@ai) {
my $zeit2 = time();
my $zeitspanne = $zeit2-$zeit1;

if ($ai == $zeitspanne) {
print @letters;
}
redo;
}
}
pktm
 2008-02-03 13:49
#105498 #105498
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Lass dir die Werte doch einfach mal zwischendurch ausgeben.

Da fehlt übrigens noch ein close(AI); Ich verwende für die Arbeit mit Dateien auch gerne FileHandle; da ist dem Betrachter des Codes leichter ersichtlich, ob ich eine Zeile oder alle Zeilen auslese (sieht nicht so kryptisch aus wie my $ai = <AI>; - aber das ist jedem selbst überlassen.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
styx-cc
 2008-02-03 13:52
#105499 #105499
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Was ist redo;?
Woher kommt @letters?
Was soll passieren?
Fehlermeldung?

edit: vergiss Was soll passieren?
Fehlermeldung?

ich sollte vorher lesen
Pörl.
FIFO
 2008-02-03 13:53
#105500 #105500
User since
2005-06-01
469 Artikel
BenutzerIn

user image
redo führt dazu, dass die Schleife immer mit dem ersten Element aus @ai ausgeführt wird, ist das beabsichtigt?
Außerdem empfiehlt sich ein
Code (perl): (dl )
chomp(my $ai = <AI>);
in Zeile 3, sonst hängt der Newline am letzten Element von @ai.
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
pl
 2008-02-03 14:20
#105503 #105503
User since
2007-06-05
26 Artikel
BenutzerIn
[default_avatar]
Das Redo wiederholt das nicht das erste Element, sondern das jetztige, also wenn $_ = 4 dann wird 4 noch mal in der Schleife als $_ verwendet. Hoffe das war verständlich :)

Eine Fehlermeldung gibt es nicht, das Skript macht nur nicht das was ich will!

Die Werte von $ai, $zeitspanne... stimmen alle
Taulmarill
 2008-02-03 14:36
#105504 #105504
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Da redo jedes mal am Ende der for Schleife ausgeführt wird, wiederholt sich die schleife jedes mal und kommt über das erste Element von @ai nicht hinaus. Hast du schon mal versucht redo einfach weg zu lassen?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pl
 2008-02-03 14:49
#105505 #105505
User since
2007-06-05
26 Artikel
BenutzerIn
[default_avatar]
Ich habs jetzt endlich:
In meinem Code fehlt das next!
Code: (dl )
1
2
3
4
5
        if ($ai == $zeitspanne) {
print @letters;
next;
}
redo;
betterworld
 2008-02-03 14:51
#105506 #105506
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
pl+2008-02-03 13:20:23--
Das Redo wiederholt das nicht das erste Element, sondern das jetztige, also wenn $_ = 4 dann wird 4 noch mal in der Schleife als $_ verwendet.

Aber warum denn, also ich meine: hä, was erwartest Du Dir davon?

Noch mal ganz genau: mit redo wird der gesamte Schleifenblock noch einmal fuer das aktuelle (...das erste) Element wiederholt. Also wird auch redo wiederholt. Das fuehrt halt zu einer Endlosschleife, genau wie Du es beschrieben hast.

Wo hast Du das mit redo denn eigentlich aufgeschnappt?

Redo macht eigentlich nur Sinn, wenn man wirklich eine Endlosschleife haben will, oder wenn man zusätzlich noch mit "if" und evtl. weiteren "last", "next", "return", etc. den Schleifenablauf manipuliert. Ein "if" hast Du zwar, aber das "redo" steht ausserhalb vom "if".

Edit: ok, waehrend ich das hier geschrieben habe, bist Du wohl schon selbst auf das next gekommen...
pl
 2008-02-03 14:53
#105507 #105507
User since
2007-06-05
26 Artikel
BenutzerIn
[default_avatar]
Ich hab schon wieder ein Problem:
Kann ich es irgendwie hinkriegen das in meinem Skript zwei Sachen auf einmal passieren, also z.B. so:
Code: (dl )
Schreibe hier deinen Namen: pl (Variable mit <STDIN>)  Vergangene Zeit: 8sek. (Schleife die sich während dessen dauernd akualisiert)


Geht dass nur mit einer grafischen Oberfläche hin (tk) oder geht das auch so?

Ich hoffe es ist klar was ich mein?!
#Kein Kommentar
 2008-02-03 18:35
#105515 #105515
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
müsste mit threads möglich sein... ist unter ActivePerl ein CORE-Paket. schau
einfach mal in deinem perl-verzeichnis nach...
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-02-03 13:03.