Thema: Datei auslesen, in die Datei hereinschreiben und ausführen (erledigt!)
Hey Leute,
Habe mal eine Frage. Und zwar hab ich die Aufgabe von Perl "Zahlen Raten - Anfänger" aufgebaut... jetzt wollt ich die ein wenig umbasteln. ich hab die ganze Aufgabe etwas schwerer gemacht (1000 Zahlen) und wollte Jetzt ein Highscoresystem bauen aus Spaß.
Der Sinn, was die Datei machen soll, is folgender:
Es soll eine Highscoredatei im gleichen Ordner liegen, die die Highscores speichert.
Stellt man einen neuen Highscore auf (z.B. nur 5 Versuche) soll das "Spiel" prüfen, ob dies auch wirklich auch ein Highscore ist.
Danach soll eine einfache Textausgabe erfolgen und dann soll der Highscore an die Richtige Stelle gesetzt werden (z.B. Platz 2)
Somit müssen die unteren Plätze ein Platz nach unten verschoben werden und der letzte Eintrag fällt komplett raus.
Ist das dann getan, soll man einen Namen eingeben und dieser sollte dann auch in der Textdatei an einer bestimmten Stelle ausgelesen werden.
Am Ende soll dann die Highscoreliste komplett ausgegeben/ das Script ausgeführt werden (top 10).
optional:
würde gern noch die Wahl der Schwierigkeit des Erratems einbauen, dazu aber mehr, wenn ich mit den oberen Geschichten durch bin.
Nun zu meinen Fragen:
Wie kann ich die Daten auslesen/überschreiben? Hab mir einen Text darüber durchgelesen, aber steige durch diese Filehandle-Geschichte nicht wirklich durch.
Zitat:
Will man Daten von einem File lesen, so muß diese Datei erst geöffnet und ihr ein "Filehandle" zugewiesen werden. Anschließend kann über dieses Filehandle auf die Daten zugegriffen werden.
Was ist denn das Filehandle genau? Ist das nur eine Art Variable für die Datei?
Wie kann ich die Verschiebung der Highscoreplätze umsetzen? Hatte anfangs die Idee, für Namen und Zahlen eigene Variablen zu setzen, aber ich hab noch keine Ideen, wie ich sowas realisieren soll.
google ist dein freund.. immer!
5min google ergeben:
was ist filehandling?
http://de.wikipedia.org/wiki/Handle
wie funktionierts unter perl?
http://perldoc.perl.org/FileHandle.html
deutschsprachiges tutorial
http://www.mathe2.uni-bayreuth.de/perl/GK/fileHandle.htm
besonders den link zur doc sollteste dir merken. den in den docs zu den jeweiligen programmiersprachen findeste zu jedem command den richtigen syntax, erklärung etz.
(achja und da ich selbst nicht mit perl arbeite, habe ich keine ahnung in wiefern das tutorial "gut" ist)
mfg zayc
Beitrag editiert (25.01.2013 17:35 Uhr)
Hallo,
Highscoresystem:
Wenn die Zahl erraten wurde hast du ja eine Variable wo die Anzahl der Versuche abgespeichert sind.
Danach liest du die Highscoredatei (zb. hs.txt) aus und liest Werte in ein Array (den Zeilenumbruch \n sollte dann entfernt werden, um die Werte auch als Integer nutzen zu können, mit chomp(@zeilen)) ein. So in etwa:

my @zeilen; open(HSDATEI, "<hs.txt") || die "Datei nicht gefunden"; while(<HSDATEI>{ push(@zeilen,$_); } close(HSDATEI); chomp(@zeilen);
hs.txt:
1
3
5
6
7
8
12
13
34
67
Jetzt musst du nur noch das Array @zeilen durchlaufen und vergleichen ob die Anzahl der Versuche eben weniger ist und dann diese einfügen.
Tipp: Ein neues Array benutzen.
Das neue Array speicherst du dann einfach in das File hs.txt (überschreiben). Etwa so:

open(NEW_HSDATEI, ">hs.txt") || die "Fehler beim Schreiben"; print NEW_HSDATEI @neue_zeilen; close(NEW_HSDATEI);
Natürlich musst du dann, wenn der Benutzer dann einen Platz in der Highscore erreicht hat, aufpassen das du das letzte Element, entweder nicht ins neue Array mit einfügst oder das letzte Element dann einfach mit der Funktion pop() herausnimmst.
Danach die Highscoreliste, das neue Array einfach durchlaufen und die Werte ausgeben.
Wenn du noch Namen mit aufnehmen möchtest würde ich in dem txt-File ein delimiter (Trennzeichen) verwenden, vielleicht ein Semikolon (; ) und dann beim Einlesen aus der txt die Splitfunktion benutzt, einen Hash erzeugst, diesen dann mit name und versuche füllst und den Hash dann ins Array einfügst.
Wenn du vielleicht schon einen Ansatz hast kannst du ihn hier posten ich helfe gerne weiter.
Gruß Jörg
Ich habs jetzt immerhin schon soweit gebracht: mit nem fertigen Array (nicht ausgelesen aus ner Datei) funktioniert es soweit schon...
Leider haperts momentan noch daran, dass der das Array aus der Datei nciht lesen will. Hab auch schon bei Google nach Lösungen gesucht aber immer ohne Erfolg. Wenn mal was geklappt hat, hat er nur die Anzahl der Reihen aufgezählt und nciht den Inhalt. Die Textdatei ist im Prinzip die selbe, wie von Gusti. (Ich habe mit <STDIN> erstmal das hereinschreiben des Skripts simuliert)
Bisher sieht es so aus:

#!/usr/bin/perl -w -l use strict; my @Zeilen = (""); open(HIGHSCORE, $_ = "<highscore.txt") || die "Datei mit E-Mails nicht gefunden"; while(<HIGHSCORE>{ @Zeilen = $_; } close(HIGHSCORE); print "Highscore : "; my $hs = <STDIN>; chomp($hs); my @s = (@Zeilen + $hs); unshift(@s, $hs); @s = join(", ", sort{$a<=>$b}(@s)); my $anzahl = @s; print $anzahl; if ($anzahl > 10) { my $x = pop (@s); print "@s"; print "$x"; } ~
Ich glaube der obere Teil ist sowieso nur Mist ^.^' Und aus deinem ersten Vprschlag konnte ich leider nicht schlau werden... Die Bedingungen der Whileschleife haben mich ein wenig verwirrt
OMG, da will mein converter doch tatsächlich ein smilie in den cde einfügen.
Deinen Code schaue ich mir später mal an.
xD so kann man auch Bugs finden xD... naja soweit läuft der erste Teil endlich (wobei er schon die ganze Zeit lief und nur die Ausgabe nicht wollte)
Er gibt den Array korrekt aus, jedoch funktioniert derhier hier beschriebene weg nciht, an die Anzahl der Array-Elemente zu kommen...
Wenn ich das noch beheben kann, wärs schon klasse.

my $anzahl = @Zeilen;

0 0 0 0 0 0 0 0 0 0 44
Die Lösung um an die Anzahl der Arrays zu kommen ist einfacher als Gedacht (wie eig immer)
Hab ich in einem anderen Forum gelesen:
Zitat:
"join" liefert kein Array, sondern einen String zurück (aus den verketteten Arrayelementen).
Das heißt also, dass man Ein Array also immer auszählen sollte, bevor man in Ordnet =)
kann man den Thread irgendiwe als gelöst markieren oder so?