Hallo,
ich würde gerne ein Perlscript schreiben, das Eingaben vom Benutzer aufnimmt, in einer Textdatei an eine bestimmte Stelle springt und den Text einfügt.
Ich kenne nur die Optionen:
-Dateien zum Lesen öffnen
-Datei zum anhängenden Schreiben öffnen >>
-+> Lesen und Schreiben
Bringt mir alles nichts. Gibts irgendwelche Tipps??
Dir wird nichts anderes übrigbleiben, als die klassische sequentielle Lösung:
alte\_datei 1esen öffnen
neue\_datei schreiben öffnen
zeilen aus alte\_datei lesen und in neue\_datei schreiben bis Position gefunden
neue Zeile in neue\_datei schreiben
restzeilen aus alte\_datei lesen und in neue\_datei schreiben
alte\_datei schließen
neue\_datei schließen
alte\_datei löschen
neue\_datei in alte\_datei umbenennen
Die alternative wäre, eine Index-Datei anzulegen, bzw. mit einer typisierten Datei zu arbeiten (ist unter Perl nicht grade einfach, und eigentlich habe ich damit keine Erfahrung (unter Perl), weiß aber, daß es geht, wow was für ein Bandwurm
datei öffnen
solange position nicht gefunden
lies datensatz (von hinten anfangen)
datensatz eins nach hinten schreiben
/solange
neuen datensatz schreiben
datei schliessen
Oh. Typisierte Dateien sind Datein mit einer festen Datensatzlänge und nur unter bestimmten Umständen hilfreich.
Dir wird nichts anderes übrigbleiben, als die klassische
sequentielle Lösung:
richtig. Der Grund ist übrigens keine mangelnde Fähigkeit von Perl, sondern vielmehr, daß es kein (mir bekanntes) Betriebssystem gibt, das solche Aktionen unterstützen würde. Perl und andere Sprachen können nun mal nur die Möglichkeiten ausschöpfen, die auch existieren.
Wenn Du irgendwo einfügen möchtest, benutze Datenbanken. Dort sind die Einträge zunächst ungeordnet, so daß ein Einfügen auch „hinten“ geschehen kann; die Sortierung geschieht im Bedarfsfall. Für Perl gibt es da diverse Module von Mysql bis DBD und DBI:BTyp (z.B. DBI:racle); in PHP ist die Datenbankanbindung aber bereits „von Haus aus“ beigefügt. Für Anfänger vielleicht die bessere Wahl.
unter VB ist das mit den typisierten Dateien eine feine Sache. Und ist bei kleineren Datenmengen (so bis 10.000 Sätze) auch hinreichend schnell.
Um das in Perl zu machen muß man glauch auf die Systemfunktionen zurückgreifen?
cu, holli
Dir wird nichts anderes übrigbleiben, als die klassische
sequentielle Lösung:
richtig. Der Grund ist übrigens keine mangelnde Fähigkeit von
Perl, sondern vielmehr, daß es kein (mir bekanntes) Betriebssystem gibt, das solche Aktionen unterstützen
würde. Perl und andere Sprachen können nun mal nur die
Möglichkeiten ausschöpfen, die auch existieren.
Wenn Du irgendwo einfügen möchtest, benutze Datenbanken. Dort
sind die Einträge zunächst ungeordnet, so daß ein Einfügen
auch „hinten“ geschehen kann; die Sortierung geschieht im
Bedarfsfall. Für Perl gibt es da diverse Module von Mysql bis
DBD und DBI:BTyp (z.B. DBI:racle); in PHP ist die
Datenbankanbindung aber bereits „von Haus aus“ beigefügt. Für
Anfänger vielleicht die bessere Wahl.
Moin moin,
Danke für deinen Vorschlag. Hab ich mir schon fast gedacht, dass ich es so machen muss. Andere Lösungen (Datenbank) kommen nicht in Frage, da es immer nur um zwei drei Werte geht, und das wäre wohl mit Kanonen auf Spatzen geschossen.
Dir wird nichts anderes übrigbleiben, als die klassische
sequentielle Lösung:
alte_datei 1esen öffnen
neue_datei schreiben öffnen
zeilen aus alte_datei lesen und in neue_datei schreiben bis
Position gefunden
neue Zeile in neue_datei schreiben
restzeilen aus alte_datei lesen und in neue_datei schreiben
alte_datei schließen
neue_datei schließen
alte_datei löschen
neue_datei in alte_datei umbenennen
Ich kann doch auch die komplette Datei in eine Liste einlesen, dann die Datei schließen, und danach die Datei zum Schreiben öffnen und die Werte einschließlich des geänderten Wertes wieder einlesen. (Denk ich zumindest). Eine zweite Datei wäre somit überflüssig.
Die alternative wäre, eine Index-Datei anzulegen, bzw. mit
einer typisierten Datei zu arbeiten (ist unter Perl nicht
grade einfach, und eigentlich habe ich damit keine Erfahrung
(unter Perl), weiß aber, daß es geht, wow was für ein Bandwurm
)
datei öffnen
solange position nicht gefunden
lies datensatz (von hinten anfangen)
datensatz eins nach hinten schreiben
/solange
neuen datensatz schreiben
datei schliessen
Oh. Typisierte Dateien sind Datein mit einer festen
Datensatzlänge und nur unter bestimmten Umständen hilfreich.
Ich kann doch auch die komplette Datei in eine Liste einlesen,
dann die Datei schließen, und danach die Datei zum Schreiben
öffnen und die Werte einschließlich des geänderten Wertes
wieder einlesen. (Denk ich zumindest). Eine zweite Datei wäre
somit überflüssig.
denk in _beiden_ Fällen daran, daß währenddessen eine andere Instanz Deines Scripts auf die Datei zugreifen, sie auslesen und eventuell veraltete (oder gar „leere“, wenn der Schreibvorgang gerade läuft) Daten lesen kann. Richtiges File-Locking ist wichtig. Siehe
unter VB ist das mit den typisierten Dateien eine feine Sache.
soweit ich weiß werden da Pseudo-Datensätze mit fester Länge angelegt, oder? Dann ist es natürlich kein Problem, bestimmte Bytes zu ändern. Normalerweise hast Du aber variable Längen vor Dir, damit geht das nicht.
Um das in Perl zu machen muß man glauch auf die
Systemfunktionen zurückgreifen?
Das muß auch VB, nur stellt es Voraussetzungen für eine andere Zugriffsart her - mit allen Vor- und Nachteilen.
unter VB ist das mit den typisierten Dateien eine feine Sache.
soweit ich weiß werden da Pseudo-Datensätze mit fester Länge
angelegt, oder? Dann ist es natürlich kein Problem, bestimmte
Bytes zu ändern. Normalerweise hast Du aber variable Längen
vor Dir, damit geht das nicht.
Stimmt genau. Aber bei Datenbanken hat man auch meist feste Satzlängen.
Um das in Perl zu machen muß man glauch auf die
Systemfunktionen zurückgreifen?
Das muß auch VB, nur stellt es Voraussetzungen für eine andere
Zugriffsart her - mit allen Vor- und Nachteilen.
Und das macht es gut. 5 Befehle open, close, put, get und seek. Die Sätze werden einfach über eine Typ-vereinbarung definiert.
Wie gesagt, feine Sache.
Ich kann doch auch die komplette Datei in eine Liste einlesen,
dann die Datei schließen, und danach die Datei zum Schreiben
öffnen und die Werte einschließlich des geänderten Wertes
wieder einlesen. (Denk ich zumindest). Eine zweite Datei wäre
somit überflüssig.
Stimmt auffallend. Allerdings gilt, zumindest falls es sich um eine Webanwendung handelt, das der Server idR mehr Plattenplatz als Arbeitsspeicher hat.