Datei schreiben in Perl

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??

MoiN!

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 :smile:

 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.

grüsse, holli

Hi,

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::smiley:BTyp (z.B. DBI::open_mouth:racle); in PHP ist die Datenbankanbindung aber bereits „von Haus aus“ beigefügt. Für Anfänger vielleicht die bessere Wahl.

Cheatah

Hi,

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::smiley:BTyp (z.B. DBI::open_mouth:racle); in PHP ist die
Datenbankanbindung aber bereits „von Haus aus“ beigefügt. Für
Anfänger vielleicht die bessere Wahl.

Cheatah

MoiN!

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.

grüsse, holli

gruesse, armin der absolute beginner

Hi,

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

perldoc -f flock

Cheatah

Hi,

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.

Cheatah

Hi,

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.

cu, holli

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.

cu, holli