Perl Programmierung - Grundkurs
$!\n";
Kopieren
Um eine Datei zu kopieren öffnen wir zwei Dateien, eine zum Lesen und eine zum Schreiben. Wir lesen aus der Quelle Zeile für Zeile und schreiben in das Ziel. Dabei prüfen wir bei jedem Schritt sorgfältig. ob ein Fehler aufgetreten ist.
use strict;
my $quelle ="original.txt";
my $ziel = ">ziel.txt";
open QUELLE, $quelle
or die "Kann die Datei $quelle nicht oeffnen: $!\n";
open AUSGABE, $ziel
or die "Kann die Datei $ziel nicht oeffnen: $!\n";
while(my $zeile = ) {
print AUSGABE $zeile
or die "Kann die Datei $ziel nicht schreiben: $!\n";
}
close AUSGABE;
close QUELLE
or die "Kann in die Datei $ziel nicht schreiben: $!\n";
Sie können auch eine Liste benutzen, um so eine ganze Textdatei auf einmal zu lesen. Das ist sinnvoll, wenn die Eingabe und die Ausgabe nacheinander erfolgen sollen.
use strict;
my $quelle ="original.txt";
my $ziel = ">ziel.txt";
open QUELLE, $quelle
my @zeilen = ; # Alle Zeilen einlesen
close QUELL;
# Hier haben wir jetzt alle Zeilen in einer Liste,
# $zeilen[0] ist die erste Zeile
open AUSGABE, $ziel;
print AUSGABE @zeilen; # Alle Zeilen werden geschrieben
close AUSGABE;
In diesem Beispiel wurde die Fehlerbehandlung weggelassen, diese können Sie noch einfügen.
Ausserdem können Sie die Zeilenenden mit der Funktion chomp entfernen, die auch eine Liste als Parameter aktzeptiert:
chomp(@liste);
Alles in einen String kopieren
Um den ganzen Inhalt einer Textdatei in einen String zu kopieren, also in eine skalare Variable, greift man auf den Trick zurück, dass man als Ende einer Zeile gar nichts aktzeptiert.
Dazu wird erst die Variable $/ auf undef gesetzt.
open QELLE, $quelle;
$/ = undef;
my $txt = ; # Ganze Datei einlesen
Jeztz kann man zum Beispiel in der ganzen Datei nach Wörtern suchen:
my $suchHallo = ($txt =~ s/Hallo//);
Der Operator =~ weist Perl an, den Inhalt der Variablen $string ($txt) für den Vergleich zu benutzen.
binmode
Sobald Sie eine nicht ASCII-Datei verarbeiten wollen, nüssen, müssen Sie dem Perl-Interpreter kenntlich machen, dass es sich bei der folgenden Datei um eine binäre Datei handelt.
open DATEI, "name.doc";
binmode(DATEI);
An beliebige Stellen in der Datei springen
Zuständig ist hierfür die Funktion seek (Im Modul Seekable oder POSIX enthalten).
Es müssen drei Dinge angegeben werden:
1. Das Datei-Handle, das Sie bearbeiten wollen
2. Die Distanz, die Sie weiter wollen
3. Den Startpunkt, von dem aus die Distanz zurückgelegt wird
Die Distanz wird in der Anzahl Bytes gemessen, die das Ziel vom Startpunkt entfernt ist. Der Startpunkt wird durch eine von drei Möglichekeiten definiert, die in der Tabelle aufgelistet sind:
Index
Symb. Name
Beschreibung
0
SEEK_SET
Position wird vom Anfang der Datei gezählt. Das erste Byte hat die Nummer 0
1
SEEK_CUR
Positition wird ab der aktuellen Position gezählt. Die aktuelle Position hat die Nummer 0
2
SEEK_END
Position wird vom Ende der Datei gezählt. Ist normalerweise negativ. Die letzte Position hat die Nummer -1
Es wird erst eine Datei mit dem Inhalt 123456789 angelegt, in der dann mit Hilfe von Positionen gesucht wird.
my $name = seek.txt;
open DATEI, ">$name" or die $!;
print DATEI 123456789;
close DATEI;
open DATEI, "$name" or die;
seek DATEI, 0, 0 or die $!; # 1
print my $ch = getc DATEI, "\n";
seek DATEI, 5, 0 or die $!; # 6
print my $ch = getc DATEI, "\n";
seek DATEI, 0, 1 or die $!; # 7
print my $ch = getc DATEI, "\n";
seek DATEI, 1, 1 or die $!; # 9
print my $ch = getc DATEI, "\n";
seek DATEI, -1, 2 or die $!; # 9
print my $ch = getc DATEI, "\n";
close DATEI;
Mit getc kann ein einzelnes Zeichen aus einer Datei gelesen werden.
Hashes speichern
Ein Hash kann zunächst als Liste gespeichert werden.
Eine andere Möglichkeit besteht darin, den Hash mit einer Datei zu verbinden. In der Perl-Literatur spricht man in dem Fall von Datenbank.
Es werden für diesen Zweck
Weitere Kostenlose Bücher