Perl Dateioperationen

Perl verwendet einen Variablentyp namens Dateihandle, um mit Dateien zu arbeiten.

Das Lesen oder Schreiben von Daten aus einer Datei erfordert ein Dateihandle.

Ein Dateihandleist einI/OName einer Verbindung.

Perl stellt drei Dateihandles bereit:STDIN,STDOUT,STDERRdie jeweils fürStandardeingabe,、StandardausgabeundStandardfehlerausgabe stehen。

In Perl können Dateien auf folgende Weise geöffnet werden:

open FILEHANDLE, EXPR
open FILEHANDLE

sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

Parameter description:

  • FILEHANDLE: Das Dateihandle, das verwendet wird, um eine eindeutige Kennung für eine Datei zu speichern.
  • EXPR: Ein Ausdruck, der aus dem Dateinamen und dem Dateizugriffstyp besteht.
  • MODE: Dateizugriffstyp.
  • PERMS: Berechtigungsbits.

open-Funktion

Im folgenden Code verwenden wir die open-Funktion im Nur-Lese-Modus<, um die Datei file.txt zu öffnen:

open(DATA, "<file.txt");

<kennzeichnet den Nur-Lese-Modus.

DATA im Code ist der Dateihandle, der zum Lesen der Datei verwendet wird. Das folgende Beispiel öffnet die Datei und gibt ihren Inhalt aus:

Beispiel

#!/usr/bin/perl open(DATA, "<file.txt") or die "Die Datei file.txt kann nicht geöffnet werden,$!"; while(<DATA>){ print "$_"; }

Der folgende Code öffnet die Datei file.txt im Schreib>modus:

open(DATA, ">file.txt") or die "file.txt 文件无法打开, $!";

>kennzeichnet den Schreibmodus.

Wenn Sie eine Datei im Lese-/Schreibmodus öffnen müssen, können Sie ein +-Zeichen vor dem Zeichen > oder < hinzufügen:

open(DATA, "+<file.txt"); or die "file.txt 文件无法打开, $!";

Dieser Modus löscht nicht die ursprünglichen Inhalte der Datei. Wenn Sie sie löschen möchten, lautet das Format wie folgt:

open DATA, "+>file.txt" or die "file.txt 文件无法打开, $!";

Wenn Sie Daten an eine Datei anhängen möchten, müssen Sie die Datei nur im Anhängemodus öffnen, bevor Sie die Daten anhängen:

open(DATA,">>file.txt") || die "file.txt 文件无法打开, $!";

>>gibt an, dass Daten an das Ende einer vorhandenen Datei angehängt werden. Wenn Sie den Inhalt der angehängten Datei lesen müssen, können Sie ein +-Zeichen hinzufügen:

open(DATA,"+>>file.txt") || die "file.txt 文件无法打开, $!";

Die folgende Tabelle listet die verschiedenen Zugriffsmodi auf:

ModeBeschreibung
< oder rIm Nur-Lese-Modus öffnen, wobei der Dateizeiger auf den Anfang der Datei zeigt.
> oder wIm Schreibmodus öffnen, wobei der Dateizeiger auf den Anfang der Datei zeigt und die Dateigröße auf null gesetzt wird. Wenn die Datei nicht existiert, wird versucht, sie zu erstellen.
>> oder aIm Schreibmodus öffnen, wobei der Dateizeiger auf das Ende der Datei zeigt. Wenn die Datei nicht existiert, wird versucht, sie zu erstellen.
+< oder r+Im Lese-/Schreibmodus öffnen, wobei der Dateizeiger auf den Anfang der Datei zeigt.
+> oder w+Im Lese-/Schreibmodus öffnen, wobei der Dateizeiger auf den Anfang der Datei zeigt und die Dateigröße auf null gesetzt wird. Wenn die Datei nicht existiert, wird versucht, sie zu erstellen.
+>> oder a+Im Lese-/Schreibmodus öffnen, wobei der Dateizeiger auf das Ende der Datei zeigt. Wenn die Datei nicht existiert, versuchen, sie zu erstellen.

Sysopen-Funktion

sysopenDiese Funktion ähnelt der open-Funktion, außer dass sich ihre Parameterformen unterscheiden.

Das folgende Beispiel öffnet eine Datei im Lese-/Schreibmodus (+<filename):

sysopen(DATA, "file.txt", O_RDWR);

Wenn Sie die Datei vor dem Aktualisieren leeren müssen, lautet die Syntax wie folgt:

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

Sie können O_CREAT verwenden, um eine neue Datei zu erstellen, O_WRONLY für den Nur-Schreibmodus und O_RDONLY für den Nur-Lesemodus.

Der PERMS-Parameter ist ein oktaler Attributwert, der die Berechtigungen nach dem Erstellen der Datei angibt. Der Standardwert ist0x666。

Die folgende Tabelle listet die möglichen Moduswerte auf:

ModeBeschreibung
O_RDWRIm Lese-/Schreibmodus öffnen, wobei der Dateizeiger auf den Anfang der Datei zeigt.
O_RDONLYIm Nur-Lese-Modus öffnen, wobei der Dateizeiger auf den Anfang der Datei zeigt.
O_WRONLYIm Schreibmodus öffnen, wobei der Dateizeiger auf den Anfang der Datei zeigt und die Dateigröße auf null gesetzt wird. Wenn die Datei nicht existiert, wird versucht, sie zu erstellen.
O_CREATDatei erstellen
O_APPENDDatei anhängen
O_TRUNCDateigröße auf null kürzen
O_EXCL Wenn die Datei vorhanden ist, wenn O_CREAT verwendet wird, wird eine Fehlermeldung zurückgegeben; damit kann getestet werden, ob die Datei existiert.
O_NONBLOCKNicht blockierende E/A bewirkt, dass unser Vorgang entweder erfolgreich ist oder sofort einen Fehler zurückgibt, ohne blockiert zu werden.

Close-Funktion

Nachdem Sie eine Datei verwendet haben, sollten Sie sie schließen, um die mit dem Dateihandle verbundenen Eingabe-/Ausgabepuffer zu leeren. Die Syntax zum Schließen einer Datei lautet wie folgt:

close FILEHANDLE
close

FILEHANDLE ist das angegebene Dateihandle; es gibt true zurück, wenn das Schließen erfolgreich ist.

close(DATA) || die "无法关闭文件";

Dateien lesen und schreiben

Es gibt mehrere verschiedene Möglichkeiten, Informationen in Dateien zu schreiben und daraus zu lesen:

<FILEHANDL> Operator

Die Hauptmethode zum Lesen von Informationen aus einem geöffneten Dateihandle ist der <FILEHANDLE>-Operator. Im skalaren Kontext gibt er eine einzelne Zeile aus dem Dateihandle zurück. Zum Beispiel:

Beispiel

#!/usr/bin/perl print "Beispiel-Tutorial-URL?\n"; $name = <STDIN>; print "Webseite:$name\n";

Nachdem das obige Programm ausgeführt wurde, werden die folgenden Informationen angezeigt. Nachdem wir die URL eingegeben haben, gibt die print-Anweisung Folgendes aus:

Wenn wir den <FILEHANDLE>-Operator verwenden, gibt er eine Liste jeder Zeile im Dateihandle zurück. Zum Beispiel können wir alle Zeilen in ein Array importieren.

Erstellen Sie zuerst die Datei import.txt mit folgendem Inhalt:

$ cat import.txt 
1
2
3

Lesen Sie import.txt und legen Sie jede Zeile in das @lines-Array:

Beispiel

#!/usr/bin/perl open(DATA,"<import.txt") or die "Daten können nicht geöffnet werden"; @lines = <DATA>; print @lines; # Array-Inhalt ausgeben close(DATA);

Nach dem Ausführen des obigen Programms ist die Ausgabe:

1
2
3

getc-Funktion

Die getc-Funktion gibt ein einzelnes Zeichen vom angegebenen FILEHANDLE zurück oder von STDIN, wenn kein FILEHANDLE angegeben ist:

getc FILEHANDLE
getc

Wenn ein Fehler auftritt oder wenn sich das Dateihandle am Ende der Datei befindet, gibt sie undef zurück.


read-Funktion

Die read-Funktion wird verwendet, um Informationen aus einem gepufferten Dateihandle zu lesen.

Diese Funktion wird verwendet, um binäre Daten aus einer Datei zu lesen.

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

Parameter description:

  • FILEHANDLE: Das Dateihandle, das verwendet wird, um eine eindeutige Kennung für eine Datei zu speichern.
  • SCALAR: Speichert das Ergebnis. Wenn OFFSET nicht angegeben ist, werden die Daten am Anfang von SCALAR platziert. Andernfalls werden die Daten nach OFFSET Bytes in SCALAR platziert.
  • LENGTH: Die Länge des zu lesenden Inhalts.
  • OFFSET: Der Offset.

Bei Erfolg wird die Anzahl der gelesenen Bytes zurückgegeben; am Dateiende wird 0 zurückgegeben; bei einem Fehler wird undef zurückgegeben.

print-Funktion

Für alle Funktionen, die Informationen aus einem Dateihandle lesen, ist die zugrunde liegende Hauptschreibfunktion print:

print FILEHANDLE LIST
print LIST
print

Mithilfe des Dateihandles und der print-Funktion können die Ergebnisse des Programms an das Ausgabegerät (STDOUT: Standardausgabe) gesendet werden, zum Beispiel:

print "Hello World!\n";

Dateikopie

Im folgenden Beispiel öffnen wir eine vorhandene Datei file1.txt, lesen jede ihrer Zeilen und schreiben sie in file2.txt:

Beispiel

#!/usr/bin/perl # Die Datei im schreibgeschützten Modus öffnen open(DATA1, "<file1.txt"); # Eine neue Datei öffnen und schreiben open(DATA2, ">file2.txt"); # Daten kopieren while(<DATA1>) { print DATA2 $_; } close( DATA1 ); close( DATA2 );

Datei umbenennen

Im folgenden Beispiel benennen wir die vorhandene Datei file1.txt in file2.txt um, im angegebenen Verzeichnis /usr/example/test/:

#!/usr/bin/perl

rename ("/usr/example/test/file1.txt", "/usr/example/test/file2.txt" );

Die Funktionrenamesakzeptiert nur zwei Parameter und benennt nur vorhandene Dateien um.

Dateien löschen

Im folgenden Beispiel zeigen wir, wie man dieunlinkFunktion verwendet, um eine Datei zu löschen:

Beispiel

#!/usr/bin/perl unlink ("/usr/example/test/file1.txt");

Dateiposition angeben

Sie können dietellFunktion verwenden, um die Dateiposition zu ermitteln, und dieseekFunktion verwenden, um die Position innerhalb der Datei anzugeben:

tell-Funktion

Die tell-Funktion wird verwendet, um die Dateiposition zu ermitteln:

tell FILEHANDLE
tell

Wenn FILEHANDLE angegeben ist, gibt die Funktion die Position des Dateizeigers in Bytes zurück. Wenn nicht angegeben, gibt sie den standardmäßig ausgewählten Dateihandle zurück.

seek-Funktion

Die seek()-Funktion liest oder schreibt Dateien, indem sie den Lese-/Schreibzeiger der Datei über das Dateihandle verschiebt, wobei in Bytes gelesen und geschrieben wird:

seek FILEHANDLE, POSITION, WHENCE

Parameter description:

  • FILEHANDLE: Dateihandle, wird verwendet, um eine eindeutige Kennung für eine Datei zu speichern.
  • POSITION: Gibt die Anzahl der Bytes an, um die das Dateihandle (Lese-/Schreibpositionszeiger) bewegt werden soll.
  • WHENCE: Gibt die Startposition an, wenn das Dateihandle (Lese-/Schreibpositionszeiger) beginnt, sich zu bewegen. Es kann die Werte 0, 1, 2 annehmen; diese stehen jeweils für den Anfang der Datei, die aktuelle Position und das Ende der Datei.

Das folgende Beispiel liest 256 Bytes vom Anfang der Datei:

seek DATA, 256, 0;

Dateiinformationen

Perls Dateioperationen können auch zuerst testen, ob eine Datei existiert, ob sie lesbar oder beschreibbar ist usw.

Wir können zuerst eine Datei file1.txt mit folgendem Inhalt erstellen:

$ cat file1.txt 
www.example.com

Beispiel

#/usr/bin/perl my $file = "/usr/test/example/file1.txt"; my (@description, $size); if (-e $file) { push @description, 'Ist eine Binärdatei' if (-B _); push @description, 'Ist ein Socket' if (-S _); push @description, 'Ist eine Textdatei' if (-T _); push @description, 'Ist eine spezielle Blockdatei' if (-b _); push @description, 'Ist eine spezielle Zeichendatei' if (-c _); push @description, 'Ist ein Verzeichnis' if (-d _); push @description, 'Datei existiert' if (-x _); push @description, (($size = -s _)) ? "$sizebytes" : 'Leer'; print "$file信息:", join(', ',@description),"\n"; }

Nach Ausführung des obigen Programms ist die Ausgabe:

file1.txt 信息:是一个文本文件, 15 字节

文件测试运算符如下表所示:

OperatorBeschreibung
-A文件上次被访问的时间(以天为单位)
-B 是否为二进制文件
-C 文件(inode)索引节点修改时间(以天为单位)
-M 文件上次修改的时间(以天为单位)
-O 文件由真实 UID 拥有
-R 文件或目录可被真实 UID/GID 读取
-S 是否为套接字
-T 是否为文本文件
-W 文件或目录可被真实 UID/GID 写入
-X 文件或目录可被真实 UID/GID 执行
-b Ist eine blockorientierte Spezialdatei (z. B. eine eingebundene Festplatte)
-c Ist eine zeichenorientierte Spezialdatei (z. B. ein E/A-Gerät)
-d Ist ein Verzeichnis
-e Datei- oder Verzeichnisname existiert
-f Ist eine reguläre Datei
-g Datei oder Verzeichnis besitzt das setgid-Attribut
-k Bei Datei oder Verzeichnis ist das Sticky-Bit gesetzt
-l Ist ein symbolischer Link
-o Datei gehört der effektiven UID
-p Datei ist eine benannte Pipe (FIFO)
-r Datei kann von der effektiven UID/GID gelesen werden
-s Datei oder Verzeichnis existiert und ist nicht 0 (gibt Byteanzahl zurück)
-t Dateihandle ist ein TTY (gibt Ergebnis der Systemfunktion isatty() zurück; dieser Test kann nicht auf einen Dateinamen angewendet werden)
-u Datei oder Verzeichnis besitzt das setuid-Attribut
-w Datei kann von der effektiven UID/GID geschrieben werden
-x Datei kann durch die effektive UID/GID ausgeführt werden
-zDatei existiert, Größe ist 0 (Verzeichnisse sind immer false), d. h., ob es sich um eine leere Datei handelt
Weitere Erweiterungen