Mit denselben Befehlen wie für den Zugriff auf Datenbanken kann auf Seiten/Templates zugegriffen werden:
Datei lesen
Liest den kompletten Inhalt der Datei
seite in die Variable
$inhalt ein. Die einzelnen Zeilen sind durch den Zeilentrenner
\n getrennt.
Eine Datei kann auch zeilenweise gelesen werden:
Liest den Inhalt der Seite
seite in das Array
@inhalt ein. Jedes Element des Arrays enthält nun eine Zeile,
$inhalt[0] also die erste,
$inhalt[1] die zweite usw. Die Zeilentrenner sind jeweils entfernt.
@inhalt=get "seite.htx", "raw";
|
Belässt die Zeilentrenner
\n am Ende jeder Zeile.
 | Know-How |
Zeilen werden in Dateien durch den Zeilentrenner \n getrennt. In Perl und anderen Programmiersprachen muss man sich selbst darum kümmern, dass am Ende der Zeilen der Zeilentrenner geschrieben oder beim Einlesen entfernt wird. baseportal macht dies automatisch, so dass man sich normalerweise nicht um das Zeilenende kümmern muss. Will man die genaue Kontrolle über den Zeilentrenner haben, muss man den Parameter raw an die Befehle anhängen. baseportal liest und schreibt die Daten dann exakt so wie sie übergeben werden.
|
|
Daten zu Datei hinzufügen
put $zusatz, "seite.htx";
|
Fügt zur Seite
seite den Inhalt der Variablen
$zusatz hinzu. Existiert die Seite noch nicht, wird sie angelegt.
Es können auch mehrere Zeilen auf einmal hinzugefügt werden, entweder durch eigenhändiges Hinzufügen des Zeilentrenners...
put "Erste Zeile\nZweite Zeile\nDritte Zeile", "seite.htx";
|
...oder durch Übergabe der einzelnen Zeilen...
put ["Erste Zeile", "Zweite Zeile", "Dritte Zeile"], "seite.htx";
|
...oder durch Übergabe eines Array-Verweises:
put \@zusatz, "seite.htx";
|
Jedes Element des Arrays
@zusatz entspricht einer Zeile.
put ["Eins", "Zwei", "Drei"], "seite.htx", "raw";
|
Unterlässt das automatische Hinzufügen der Zeilentrenner, so dass tatsächlich "EinsZweiDrei" geschrieben wird und auch kein Zeilentrenner am Ende hinzugefüht wird.
Inhalt einer Datei ändern
mod $inhalt_neu, "seite.htx";
|
Ändert den Inhalt der Seite
seite in den Inhalt der Variablen
$inhalt_neu. Der alte Inhalt der Seite
seite geht verloren.
Ebenso wie beim
put können mehrere Zeilen durch einen Array-Verweis übergeben werden und auch hier funktioniert das
raw:
mod \@inhalt_neu, "seite.htx", "raw";
|
Die Zeilen des Arrays
@inhalt_neu ersetzen den ursprünglichen Inhalt der Seite
seite. Zeilentrenner werden dabei nicht automatisch hinzugefügt.
Mit gleichzeitigen Zugriffen umgehen
Oft wird der Inhalt einer Datei gelesen, verändert und dann wieder zurückgeschrieben. Was auf den ersten Blick oder bei einem lokalen Einzelplatzrechner funktioniert, wird bei Web-Anwendungen früher oder später zu Problemen führen, da mehrere Nutzer
gleichzeitig auf die Daten zugreifen können.
baseportal erlaubt zur Lösung dieses Problems, dem Befehl
mod einen Perl-Code zu übergeben, der mit dem Inhalt der Datei ausgeführt wird. Das Ergebnis des Codes wird in die Datei geschrieben. Es wird dabei sichergestellt, dass während des gesamten Vorgangs kein anderer auf die Datei zugreift. Der Inhalt der Datei wird in
$_ bereitgestellt - der Rückgabewert des Codes wird zum neuen Inhalt.
mod sub { ++$_ }, "zaehler.htx";
|
Liest den Inhalt der Seite
zaehler ein, erhöht ihn um 1 und schreibt den neuen Wert zurück. Dieser Code ist "thread-safe".
Durch Anfügen des Parameters
line wird der Code zeilenweise durchlaufen.
$_ enthält dann den Wert der jeweiligen Zeile:
mod sub { $cnt++; "$cnt. $_" }, "zeilen.htx", "line";
|
Numeriert die Zeilen der Seite
zeilen durch. Bevor nicht die komplette Datei durchgearbeitet wurde kann niemand auf sie zugreifen.
Durch den Parameter
all wird die Seite komplett zeilenweise eingelesen und im Array
@_ bereitgestellt:
mod sub { reverse @_ }, "zeilen.htx", "all";
|
Dreht die Reihenfolge aller Zeilen um.
Hier ein Beispiel für ein Zählprogramm, wie man es
nicht machen sollte:
<perl> $cnt=get "zaehler.htx"; # Zähler einlesen $cnt++; # Zähler um 1 erhöhen put "zaehler.htx", $cnt; # Zähler zurückschreiben </perl>
|
Führt man dieses Programm hintereinander aus, wird es zunächst aussehen, als ob es problemlos funktionieren würde. Was passiert aber, wenn das Programm nicht hintereinander, sondern von verschiedenen Nutzern
gleichzeitig ausgeführt wird? Dazu muss man wissen, wie ein Computer mit mehreren gleichzeitigen Anfragen umgeht: Er "verschränkt" sie ineinander und führt von jeder Anfrage nur einen Teil aus, geht dann zur nächsten Anfrage, führt wieder nur einen Teil aus, geht zur nächsten usw.
Folgendes könnte also passieren:
- Die Nutzer A und B greifen gleichzeitig auf eine Seite zu, in der das Zählprogramm enthalten ist.
- Der Computer bearbeitet Nutzer A und liest den Wert des Zählers, ein z.B. 0
- Jetzt bearbeitet der Computer Nutzer B und liest den Wert des Zählers ein: 0 (!!)
- Jetzt ist wieder Nutzer A an der Reihe - der Computer erhöht den Wert der Variablen $cnt (von Nutzer A): 1
- Auch bei Nutzer B erhöht der Computer den Wert der Variablen $cnt (von Nutzer B): 1 (!!)
- Nutzer A ist dran und der Computer speichert $cnt (von Nutzer A): 1
- Nutzer B ist dran und der Computer speichert $cnt (von Nutzer B): 1 (!!)
Obwohl 2 Nutzer darauf zugegriffen haben, wurde der Zähler nur um 1 erhöht!
Datei löschen
Löscht die Seite
seite.