Perl - Datei-E / A.
Die Grundlagen des Umgangs mit Dateien sind einfach: Sie ordnen a zu filehandle mit einer externen Entität (normalerweise einer Datei) und verwenden Sie dann eine Vielzahl von Operatoren und Funktionen in Perl, um die Daten zu lesen und zu aktualisieren, die in dem mit dem Dateihandle verknüpften Datenstrom gespeichert sind.
Ein Dateihandle ist eine benannte interne Perl-Struktur, die eine physische Datei mit einem Namen verknüpft. Alle Dateihandles können lesen / schreiben, sodass Sie alle Dateien oder Geräte lesen und aktualisieren können, die einem Dateihandle zugeordnet sind. Wenn Sie jedoch ein Dateihandle zuordnen, können Sie den Modus angeben, in dem das Dateihandle geöffnet wird.
Drei grundlegende Dateihandles sind - STDIN, STDOUT, und STDERR, die Standardeingabe-, Standardausgabe- und Standardfehlergeräte darstellen.
Dateien öffnen und schließen
Es gibt zwei Funktionen mit mehreren Formularen, mit denen Sie jede neue oder vorhandene Datei in Perl öffnen können.
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
Hier ist FILEHANDLE das von der zurückgegebene Dateihandle open Funktion und EXPR ist der Ausdruck mit dem Dateinamen und dem Modus zum Öffnen der Datei.
Funktion öffnen
Es folgt die zu öffnende Syntax file.txtim schreibgeschützten Modus. Hier bedeutet weniger als <Zeichen, dass die Datei im schreibgeschützten Modus geöffnet werden muss.
open(DATA, "<file.txt");
Hier ist DATA das Dateihandle, mit dem die Datei gelesen wird. Hier ist das Beispiel, das eine Datei öffnet und ihren Inhalt über den Bildschirm druckt.
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";
while(<DATA>) {
print "$_";
}
Es folgt die Syntax zum Öffnen von file.txt im Schreibmodus. Hier bedeutet weniger als>, dass die Datei im Schreibmodus geöffnet werden muss.
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
In diesem Beispiel wird die Datei tatsächlich abgeschnitten (geleert), bevor sie zum Schreiben geöffnet wird. Dies ist möglicherweise nicht der gewünschte Effekt. Wenn Sie eine Datei zum Lesen und Schreiben öffnen möchten, können Sie vor den Zeichen> oder <ein Pluszeichen setzen.
Zum Beispiel, um eine Datei zum Aktualisieren zu öffnen, ohne sie abzuschneiden -
open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";
So schneiden Sie die Datei zuerst ab -
open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";
Sie können eine Datei im Anhänge-Modus öffnen. In diesem Modus wird der Schreibpunkt auf das Ende der Datei gesetzt.
open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";
Ein doppeltes >> öffnet die Datei zum Anhängen und platziert den Dateizeiger am Ende, sodass Sie sofort mit dem Anhängen von Informationen beginnen können. Sie können jedoch nur dann daraus lesen, wenn Sie auch ein Pluszeichen davor platzieren.
open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";
Es folgt die Tabelle, in der die möglichen Werte für verschiedene Modi angegeben sind
Sr.Nr. | Entitäten & Definition |
---|---|
1 | < or r Schreibgeschützter Zugriff |
2 | > or w Erstellt, schreibt und schneidet ab |
3 | >> or a Schreibt, hängt an und erstellt |
4 | +< or r+ Liest und schreibt |
5 | +> or w+ Liest, schreibt, erstellt und schneidet ab |
6 | +>> or a+ Liest, schreibt, hängt an und erstellt |
Sysopen-Funktion
Das sysopen Die Funktion ähnelt der Hauptöffnungsfunktion, verwendet jedoch das System open() Funktion unter Verwendung der ihm zur Verfügung gestellten Parameter als Parameter für die Systemfunktion -
Um beispielsweise eine Datei zum Aktualisieren zu öffnen, emulieren Sie die +<filename Format von offen -
sysopen(DATA, "file.txt", O_RDWR);
Oder um die Datei vor dem Aktualisieren abzuschneiden -
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
Sie können O_CREAT verwenden, um eine neue Datei zu erstellen, und O_WRONLY, um eine Datei im schreibgeschützten Modus zu öffnen, und O_RDONLY, um eine Datei im schreibgeschützten Modus zu öffnen.
Das PERMSArgument gibt die Dateiberechtigungen für die angegebene Datei an, wenn diese erstellt werden muss. Standardmäßig dauert es0x666.
Es folgt die Tabelle, in der die möglichen Werte von MODE angegeben sind.
Sr.Nr. | Entitäten & Definition |
---|---|
1 | O_RDWR Lesen und Schreiben |
2 | O_RDONLY Schreibgeschützt |
3 | O_WRONLY Nur schreiben |
4 | O_CREAT Erstellen Sie die Datei |
5 | O_APPEND Hängen Sie die Datei an |
6 | O_TRUNC Schneiden Sie die Datei ab |
7 | O_EXCL Stoppt, wenn die Datei bereits vorhanden ist |
8 | O_NONBLOCK Nicht blockierende Benutzerfreundlichkeit |
Funktion schließen
Um ein Dateihandle zu schließen und damit das Dateihandle von der entsprechenden Datei zu trennen, verwenden Sie die closeFunktion. Dadurch werden die Puffer des Dateihandles geleert und der Dateideskriptor des Systems geschlossen.
close FILEHANDLE
close
Wenn kein FILEHANDLE angegeben ist, wird das aktuell ausgewählte Dateihandle geschlossen. Es wird nur dann true zurückgegeben, wenn die Puffer erfolgreich geleert und die Datei geschlossen werden konnte.
close(DATA) || die "Couldn't close file properly";
Dateien lesen und schreiben
Sobald Sie ein offenes Dateihandle haben, müssen Sie in der Lage sein, Informationen zu lesen und zu schreiben. Es gibt verschiedene Möglichkeiten, Daten in die Datei zu lesen und zu schreiben.
Der Operator <FILEHANDL>
Die Hauptmethode zum Lesen der Informationen aus einem geöffneten Dateihandle ist der Operator <FILEHANDLE>. In einem skalaren Kontext wird eine einzelne Zeile aus dem Dateihandle zurückgegeben. Zum Beispiel -
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
Wenn Sie den Operator <FILEHANDLE> in einem Listenkontext verwenden, wird eine Liste von Zeilen aus dem angegebenen Dateihandle zurückgegeben. Zum Beispiel, um alle Zeilen aus einer Datei in ein Array zu importieren -
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
getc Funktion
Die Funktion getc gibt ein einzelnes Zeichen aus dem angegebenen FILEHANDLE oder STDIN zurück, wenn keines angegeben ist.
getc FILEHANDLE
getc
Wenn ein Fehler aufgetreten ist oder sich das Dateihandle am Ende der Datei befindet, wird stattdessen undef zurückgegeben.
Funktion lesen
Die Lesefunktion liest einen Informationsblock aus dem gepufferten Dateihandle: Mit dieser Funktion werden Binärdaten aus der Datei gelesen.
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
Die Länge der gelesenen Daten wird durch LENGTH definiert, und die Daten werden am Anfang von SCALAR platziert, wenn kein OFFSET angegeben ist. Andernfalls werden Daten nach OFFSET-Bytes in SCALAR platziert. Die Funktion gibt die Anzahl der bei Erfolg gelesenen Bytes zurück, Null am Ende der Datei oder undef, wenn ein Fehler aufgetreten ist.
Druckfunktion
Bei all den verschiedenen Methoden zum Lesen von Informationen aus Dateihandles ist die Hauptfunktion zum Zurückschreiben von Informationen die Druckfunktion.
print FILEHANDLE LIST
print LIST
print
Die Druckfunktion druckt den ausgewerteten Wert von LIST in FILEHANDLE oder in das aktuelle Ausgabe-Dateihandle (standardmäßig STDOUT). Zum Beispiel -
print "Hello World!\n";
Dateien kopieren
In diesem Beispiel wird eine vorhandene Datei file1.txt geöffnet, zeilenweise gelesen und eine weitere Kopierdatei file2.txt generiert.
#!/usr/bin/perl
# Open file to read
open(DATA1, "<file1.txt");
# Open new file to write
open(DATA2, ">file2.txt");
# Copy data from one file to another.
while(<DATA1>) {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
Datei umbenennen
Hier ist ein Beispiel, das zeigt, wie wir eine Datei file1.txt in file2.txt umbenennen können. Angenommen, die Datei ist im Verzeichnis / usr / test verfügbar.
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
Diese Funktion renames nimmt zwei Argumente und benennt nur die vorhandene Datei um.
Vorhandene Datei löschen
Hier ist ein Beispiel, das zeigt, wie eine Datei file1.txt mit dem gelöscht wird unlink Funktion.
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
Positionierung in einer Datei
Sie können verwenden, um tell Funktion, um die aktuelle Position einer Datei zu kennen und seek Funktion zum Zeigen einer bestimmten Position innerhalb der Datei.
Funktion mitteilen
Die erste Voraussetzung ist, Ihre Position in einer Datei zu finden, was Sie mit der Tell-Funktion tun -
tell FILEHANDLE
tell
Dies gibt die Position des Dateizeigers in Bytes innerhalb von FILEHANDLE zurück, falls angegeben, oder das aktuell standardmäßig ausgewählte Dateihandle, falls keines angegeben ist.
Funktion suchen
Die Suchfunktion positioniert den Dateizeiger auf die angegebene Anzahl von Bytes in einer Datei -
seek FILEHANDLE, POSITION, WHENCE
Die Funktion verwendet die fseek-Systemfunktion, und Sie haben die gleiche Fähigkeit, relativ zu drei verschiedenen Punkten zu positionieren: dem Start, dem Ende und der aktuellen Position. Sie tun dies, indem Sie einen Wert für WHENCE angeben.
Null legt die Position relativ zum Dateianfang fest. Beispielsweise setzt die Zeile den Dateizeiger auf das 256. Byte in der Datei.
seek DATA, 256, 0;
Dateiinformationen
Sie können bestimmte Funktionen in Perl sehr schnell mit einer Reihe von Testoperatoren testen, die zusammen als -X-Tests bezeichnet werden. Um beispielsweise einen schnellen Test der verschiedenen Berechtigungen für eine Datei durchzuführen, können Sie ein Skript wie das folgende verwenden:
#/usr/bin/perl
my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
push @description, 'binary' if (-B _);
push @description, 'a socket' if (-S _);
push @description, 'a text file' if (-T _);
push @description, 'a block special file' if (-b _);
push @description, 'a character special file' if (-c _);
push @description, 'a directory' if (-d _);
push @description, 'executable' if (-x _);
push @description, (($size = -s _)) ? "$size bytes" : 'empty';
print "$file is ", join(', ',@description),"\n";
}
Hier ist die Liste der Funktionen, die Sie für eine Datei oder ein Verzeichnis überprüfen können -
Sr.Nr. | Operator & Definition |
---|---|
1 | -A Startzeit des Skripts abzüglich der letzten Zugriffszeit der Datei in Tagen. |
2 | -B Ist es eine Binärdatei? |
3 | -C Startzeit des Skripts abzüglich der letzten Inode-Änderungszeit der Datei in Tagen. |
3 | -M Startzeit des Skripts abzüglich der Änderungszeit der Datei in Tagen. |
4 | -O Ist die Datei im Besitz der realen Benutzer-ID? |
5 | -R Ist die Datei für die reale Benutzer-ID oder die reale Gruppe lesbar? |
6 | -S Ist die Datei ein Socket? |
7 | -T Ist es eine Textdatei? |
8 | -W Ist die Datei durch die reale Benutzer-ID oder die reale Gruppe beschreibbar? |
9 | -X Ist die Datei mit der realen Benutzer-ID oder der realen Gruppe ausführbar? |
10 | -b Ist es eine Block-Spezialdatei? |
11 | -c Ist es eine spezielle Zeichendatei? |
12 | -d Ist die Datei ein Verzeichnis? |
13 | -e Existiert die Datei? |
14 | -f Ist es eine einfache Datei? |
15 | -g Hat die Datei das setgid-Bit gesetzt? |
16 | -k Hat die Datei das Sticky-Bit gesetzt? |
17 | -l Ist die Datei ein symbolischer Link? |
18 | -o Ist die Datei im Besitz der effektiven Benutzer-ID? |
19 | -p Ist die Datei eine Named Pipe? |
20 | -r Ist die Datei für die effektive Benutzer- oder Gruppen-ID lesbar? |
21 | -s Gibt die Größe der Datei zurück, Nullgröße = leere Datei. |
22 | -t Wird das Dateihandle von einem TTY (Terminal) geöffnet? |
23 | -u Hat die Datei das Setuid-Bit gesetzt? |
24 | -w Ist die Datei durch die effektive Benutzer- oder Gruppen-ID beschreibbar? |
25 | -x Ist die Datei durch die effektive Benutzer- oder Gruppen-ID ausführbar? |
26 | -z Ist die Dateigröße Null? |