Suche…


Parameter

Modus Erklärung
> Schreiben (abschneiden) Überschreibt vorhandene Dateien. Erstellt eine neue Datei, wenn keine Datei gefunden wurde
>> Schreiben (anhängen) Überschreibt keine Dateien, sondern fügt am Ende neue Inhalte hinzu. Erstellt auch eine Datei, wenn eine nicht vorhandene Datei geöffnet wird.
< Lesen Öffnet die Datei im schreibgeschützten Modus.
+< Lesen / Schreiben Die Datei wird nicht erstellt oder abgeschnitten.
+> Lesen / Schreiben (abschneiden) . Erzeugt und schneidet die Datei ab.
+>> Lesen / Schreiben (Anhängen) . Die Datei wird erstellt, aber nicht abgeschnitten.

Bemerkungen

chomp wird häufig beim Lesen aus einer Datei verwendet. Standardmäßig wird der Zeilenvorschub abgeschnitten . Die vollständige Funktionalität bezieht sich jedoch auf die Perldocs .

Beachten Sie den Unterschied zwischen Zeichen und Bytes: Nicht alle Kodierungen - insbesondere UTF-8 - verwenden 1-Byte-Zeichen. Während dies von PerlIO ziemlich fehlerlos gehandhabt wird, gibt es eine mögliche Gefahr:

  • read verwendet Zeichen für seine Längen- und Offset- Parameter
  • seek und tell immer Bytes zum Positionieren

Verwenden Sie also keine Arithmetik, die auf diesen gemischten Werten basiert. Verwenden Sie stattdessen zB Encode::encode('utf8',$value_by_read) das Bytes zu erhalten (Bytes) von einem read dessen Zähler Sie dann mit verwenden können tell und seek .

Lesen aus einer Datei

my $filename = '/path/to/file';

open my $fh, '<', $filename or die "Failed to open file: $filename"; 
    
# You can then either read the file one line at a time...
while(chomp(my $line = <$fh>)) {
    print $line . "\n";
}

# ...or read whole file into an array in one go
chomp(my @fileArray = <$fh>); 

Wenn Sie wissen, dass Ihre Eingabedatei UTF-8 ist, können Sie die Kodierung angeben:

open my $fh, '<:encoding(utf8)', $filename or die "Failed to open file: $filename";

Nach dem Lesen aus der Datei sollte das Dateihandle geschlossen werden:

close $fh or warn "close failed: $!";

Siehe auch: Lesen einer Datei in eine Variable

Eine andere und schnellere Methode zum Lesen einer Datei ist die Verwendung von File :: Slurper Module. Dies ist nützlich, wenn Sie mit vielen Dateien arbeiten.

use File::Slurper;
my $file = read_text("path/to/file"); # utf8 without CRLF transforms by default
print $file; #Contains the file body

Siehe auch: [Lesen einer Datei mit Slurp]

In eine Datei schreiben

Dieser Code öffnet eine Datei zum Schreiben. Gibt einen Fehler zurück, wenn die Datei nicht geöffnet werden konnte. Schließt auch die Datei am Ende.

#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

# Open "output.txt" for writing (">") and from now on, refer to it as the variable $fh.
open(my $fh, ">", "output.txt")
# In case the action failed, print error message and quit.
or die "Can't open > output.txt: $!";

Nun haben wir eine offene Datei, die zum Schreiben bereit ist, auf die wir über $fh zugreifen (diese Variable wird als Dateihandle bezeichnet ). Als Nächstes können Sie die Ausgabe mithilfe des print in diese Datei leiten:

# Print "Hello" to $fh ("output.txt").
print $fh "Hello";
# Don't forget to close the file once we're done!
close $fh or warn "Close failed: $!";

Der open Operator hat als ersten Parameter eine skalare Variable (in diesem Fall $fh ). Da es im open Operator definiert ist, wird es als Dateihandle behandelt. Der zweite Parameter ">" (größer als) legt fest, dass die Datei zum Schreiben geöffnet wird. Der letzte Parameter ist der Pfad der Datei, in die die Daten geschrieben werden sollen.

Um die Daten in die Datei zu schreiben, der print wird Bediener mit dem Dateihandle verwendet zusammen. Beachten Sie, dass in dem print Operator gibt es kein Komma zwischen dem Dateihandle und der Aussage selbst, sondern nur Leerzeichen.

Ein FileHandle zum Lesen öffnen

Generische ASCII-Textdateien öffnen

5.6.0
open my $filehandle, '<', $name_of_file or die "Can't open $name_of_file, $!";

Dies ist das grundlegende Idiom für "default" File IO und macht $filehandle einem lesbaren Eingabestrom von bytes , der von einem systemspezifischen Standarddecoder gefiltert wird, der lokal mit dem open Pragma festgelegt werden kann

Perl selbst behandelt Fehler beim Öffnen von Dateien nicht. Daher müssen Sie diese selbst prüfen, indem Sie die Beendigungsbedingung für das open prüfen. $! wird mit der Fehlermeldung aufgefüllt, die dazu geführt hat, dass das Öffnen fehlgeschlagen ist.

Unter Windows ist der Standarddecoder ein "CRLF" -Filter, der alle "\ r \ n" -Sequenzen in der Eingabe auf "\ n" abbildet.

Binärdateien öffnen

5.8.0
open my $filehandle, '<:raw', 'path/to/file' or die "Can't open $name_of_file, $!";

Dies gibt an, dass Perl keine CRLF Übersetzung unter Windows ausführen soll.

UTF8-Textdateien öffnen

5.8.0
open my $filehandle, '<:raw:encoding(utf-8)', 'path/to/file' 
   or die "Can't open $name_of_file, $!";

Dies gibt an, dass Perl sollten beide vermeiden CRLF Übersetzung, und dann die resultierenden Bytes in Zeichenfolgen dekodieren (intern als Arrays von ganzen Zahlen durchgeführt , die 255 überschreiten kann) anstelle von Strings von Bytes

Lesen und Schreiben in eine Datei

Bevor Sie Textdateien lesen und schreiben, sollten Sie wissen, welche Kodierung verwendet werden soll. Weitere Informationen zur Kodierung finden Sie in der Perl Unicode-Dokumentation . Hier zeigen wir die Einstellung von UTF-8 als Standardcodierung und -decodierung für die Funktion open . Verwenden Sie dazu das open Pragma oben in Ihrem Code (direkt nach der use strict; und use warnings; wäre angebracht):

use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); 

Die open Funktion erstellt ein Dateihandle, das zum Lesen und / oder Schreiben in eine Datei verwendet wird. Die open Funktion hat die Signatur

open(FILEHANDLE, MODE, FILEPATH) und gibt einen falschen Wert zurück, wenn die Operation fehlschlägt. Die Fehlerbeschreibung wird dann in $! gespeichert $! .

lesen

#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

my $file_path = "/path/to/file";
open(my $file_handle, '<', $file_path) or die "Could not open file! $!";

while(my $row = <$file_handle>) {
    print chomp($row), "\n";
}

close $file_handle 
      or warn "Close failed!";

Schreiben

#!/usr/bin/perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

my $file_path = "/path/to/file";
open(my $file_handle, '>', $file_path) or die "Could not open file! $!";

print $file_handle "Writing to a file";

close $file_handle 
      or warn "Close failed!";

Brocken lesen

Das Öffnen und Lesen großer Dateien kann einige Zeit und Ressourcen in Anspruch nehmen. Wenn nur ein kleiner Teil des Inhalts erforderlich ist, empfiehlt es sich, den Inhalt in Abschnitten mithilfe der read , die die Signatur enthält, zu read

read(FILEHANDLE, SCALAR, LENGTH, OFFSET)

FILEHANDLE muss ein geöffneter Datei-Handle sein, SCALAR hält die gelesenen Daten nach der Operation. LENGTH gibt die Anzahl der zu lesenden Zeichen ab OFFSET . Die Funktion gibt die Anzahl der gelesenen Zeichen zurück, 0 wenn das Ende der Datei erreicht wurde und im Fehlerfall undef .

read($file_handle, $data, 16, 0); 

Liest 16 Zeichen vom Anfang der Datei in $data .

"autodie verwenden", und Sie müssen die Fehler beim Öffnen / Schließen der Datei nicht überprüfen

autodie können Sie mit Dateien arbeiten, ohne explizit nach Fehlern beim Öffnen / Schließen zu suchen.

Seit Perl 5.10.1 ist das autodie Pragma in Core-Perl verfügbar. Wenn verwendet, sucht Perl beim Öffnen und Schließen von Dateien automatisch nach Fehlern.

Hier ist ein Beispiel, in dem alle Zeilen einer Datei gelesen und dann an das Ende einer Protokolldatei geschrieben werden.

use 5.010;    # 5.010 and later enable "say", which prints arguments, then a newline
use strict;   # require declaring variables (avoid silent errors due to typos)
use warnings; # enable helpful syntax-related warnings
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding
use autodie;  # Automatically handle errors in opening and closing files

open(my $fh_in, '<', "input.txt"); # check for failure is automatic

# open a file for appending (i.e. using ">>")
open( my $fh_log, '>>', "output.log"); # check for failure is automatic

while (my $line = readline $fh_in) # also works: while (my $line = <$fh_in>)
{
     # remove newline
     chomp $line;

     # write to log file
     say $fh_log $line or die "failed to print '$line'"; # autodie doesn't check print
}

# Close the file handles (check for failure is automatic)
close $fh_in;
close $fh_log;

By the way, sollten Sie technisch immer überprüfen , print Aussagen. Viele Leute tun dies nicht, aber perl (der Perl-Interpreter) tut dies nicht automatisch und auch nicht autodie .

Einen Dateihandle zurückspulen

Manchmal ist es notwendig, nach dem Lesen einen Rücklauf durchzuführen.

# identify current position in file, in case the first line isn't a comment
my $current_pos = tell; 

while (my $line = readline $fh)
{
    if ($line =~ /$START_OF_COMMENT_LINE/)
    {
        push @names, get_name_from_comment($line);
    }
    else {
        last; # break out of the while loop
    }
    $current_pos = tell; # keep track of current position, in case we need to rewind the next line read
}

# Step back a line so that it can be processed later as the first data line
seek $fh, $current_pos, 0;

Lesen und Schreiben von gzip-komprimierten Dateien

Eine komprimierte Datei schreiben

Um eine gzippte Datei zu schreiben, use das Modul IO::Compress::Gzip und erstellen Sie ein Dateihandle, indem Sie eine neue Instanz von IO::Compress::Gzip für die gewünschte Ausgabedatei erstellen:

use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

use IO::Compress::Gzip;

my $fh_out = IO::Compress::Gzip->new("hello.txt.gz");

print $fh_out "Hello World!\n";

close $fh_out;

use IO::Compress::Gzip;

Lesen aus einer komprimierten Datei

Um aus einer gzippierten Datei zu lesen, use das Modul IO::Uncompress::Gunzip und erstellen dann ein Dateihandle, indem Sie eine neue Instanz von IO::Uncompress::Gunzip für die Eingabedatei erstellen:

#!/bin/env perl
use strict;
use warnings;
use open qw( :encoding(UTF-8) :std ); # Make UTF-8 default encoding

use IO::Uncompress::Gunzip;

my $fh_in = IO::Uncompress::Gunzip->new("hello.txt.gz");

my $line = readline $fh_in;

print $line;

Festlegen der Standardcodierung für E / A

# encode/decode UTF-8 for files and standard input/output
use open qw( :encoding(UTF-8) :std ); 

Dieses pragma ändert den Standardmodus für das Lesen und Schreiben von Text (Dateien, Standardeingabe, Standardausgabe und Standardfehler) in UTF-8, was normalerweise beim Schreiben neuer Anwendungen gewünscht wird.

ASCII ist eine Untergruppe von UTF-8. Es wird daher nicht erwartet, dass dies Probleme mit älteren ASCII-Dateien verursacht. Sie schützt Sie vor versehentlichem Dateibeschädigung, wenn UTF-8-Dateien als ASCII behandelt werden.

Es ist jedoch wichtig, dass Sie wissen, wie die Kodierung Ihrer Dateien ist, und dass Sie entsprechend damit umgehen. ( Gründe, aus denen wir Unicode nicht ignorieren sollten. ) Weitere Informationen zur Behandlung von Unicode finden Sie im Perl-Unicode-Thema .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow