So Lesen Sie eine Textdatei in Perl

Aufgabe. Es gibt eine Textdatei. Müssen laden Sie den Inhalt in eine Skalare Variable im Perl-Programm.

Diese Aufgabe erscheint relativ Häufig. Zum Beispiel, ein solches Problem kann auftreten, zum Lesen von Konfigurationsdateien oder kleine Dateien mit Daten. In diesem Fall, wenn eine große Datei verarbeitet werden soll, dann besser nicht verwenden diese Methode, sondern nutzen Streaming-Lesen aus einer Datei.

Lösung. Verwenden Sie die Bibliothek Path::Tiny

Die einfachste und günstige Lösung ist die Verwendung der Perl-Bibliothek Path::Tiny

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

use Path::Tiny;

my $file_name = 'a.txt';

my $content = path($file_name)->slurp_utf8();

print $content;

Hier path('a.txt') erzeugt ein Objekt der Klasse Path::Tiny, und ->slurp_utf8() ruft die Methode slurp_utf8 bei diesem Objekt. Das Ergebnis in der Variablen $content erscheint der gesamte Inhalt der Datei.

Es ist eine gute Lösung, aber es gibt eine Feinheit. Bibliothek Path::Tiny geht nicht zusammen mit Perl, müssen Sie ihn separat setzen. Normalerweise ist es kein Problem, aber in manchen Situationen ist diese Lösung nicht geeignet.

Lösung. Lesen Sie die Datei Standard mittels Perl

Diese Lösung ist nicht so bequem wie die Nutzung der Bibliothek Path::Tiny, ist es notwendig, mehr zu schreiben, aber es erfordert nicht die Installation von zusätzlichen Bibliotheken.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = '';

open FILE, '<', $file_name or die $!;

while (<FILE>) {
    $content .= $_;
}

print $content;

Mit Hilfe open haben wir Datei-Handler FILE. Bei der Arbeit mit open ist es wichtig, die drei Argumente schreiben und es ist sehr wichtig or die, und nicht || die. Weiter mit dem while (<FILE>) wir laufen auf der ganzen Datei Zeile für Zeile und erfassen alle Inhalte in Variable $content.

Zunächst vergeben wir die Variable $content Leerzeile ''. Dies ist notwendig, um den Code korrekt funktioniert, im Falle von leeren Dateien (wenn nicht eine leere Zeichenfolge zuweisen, im Falle einer leeren Datei in der Variablen $content wird undef).

Eine gefährliche Entscheidung. Verwenden cat

Hier ist ein weiterer Weg, wie möglich, Lesen Sie den Inhalt der Datei in eine Variable. Diese Lösung erfordert keine zusätzlichen Bibliotheken und erfordert nicht das schreiben viele Zeilen Code, aber es ist костыльное Lösung. Am besten so nie schreiben. Das einzige wenn es so möglich ist zu tun ist, wenn im Projekt keine Path::Tany, gibt es eine aktive Arbeit und für die Prüfung der anderen Teile des Programms müssen schnell einen Code der die Datei liest. Aber in diesem Fall ist es notwendig, neben Hinterlasse einen Kommentar # TODO und bei der ersten Gelegenheit entfernen Sie diesen Schlüssel.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = `cat $file_name`;

print $content;

Warum ist es eine schlechte Entscheidung. Erstens es gibt keine Fehlerbehandlung. Wenn Sie keine Datei, dann auf STDERR wird eine Warnung angezeigt cat: asdf: No such file or directory, aber das Programm wird weiter gehen. Zweitens das nicht funktioniert wenn im Dateinamen ein Leerzeichen. Drittens: wenn der Inhalt der Variablen $file_name wir erhalten von außen gibt es eine Chance, dass es so etwas wie a.txt; rm -rf / und neben dem Lesen der Datei wird noch unsichere Aktionen durchgeführt.

Andere Artikel