Recherche…


Paramètres

Mode Explication
> Ecrire (trunc) . Ecrasera les fichiers existants. Crée un nouveau fichier si aucun fichier n'a été trouvé
>> Ecrire (ajouter) . N'écrasera pas les fichiers mais ajoutera du nouveau contenu à la fin. Crée également un fichier s'il est utilisé pour ouvrir un fichier non existant.
< Lire . Ouvre le fichier en mode lecture seule.
+< Lecture / écriture . Ne va pas créer ou tronquer le fichier.
+> Lecture / écriture (trunc) . Va créer et tronquer le fichier.
+>> Lecture / écriture (append) . Va créer mais ne pas tronquer le fichier.

Remarques

chomp est souvent utilisé lors de la lecture d'un fichier. Par défaut, il coupe le caractère de nouvelle ligne, bien que pour sa fonctionnalité complète, reportez-vous aux perldocs .

Méfiez-vous de la différence entre les caractères et les octets: tous les encodages, en particulier UTF-8, n'utilisent que des caractères d'un octet. Bien que PerlIO gère parfaitement ce problème, il existe un écueil potentiel:

  • read utilise des caractères pour ses paramètres de longueur et de décalage
  • seek et tell toujours utiliser des octets pour le positionnement

N'utilisez donc pas d'arithmétique basée sur ces valeurs mixtes. Utilisez plutôt, par exemple, Encode::encode('utf8',$value_by_read) pour obtenir les octets (octets) d'un résultat de read , dont vous pouvez alors utiliser le compte avec tell et seek .

Lecture d'un fichier

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>); 

Si vous savez que votre fichier d'entrée est UTF-8, vous pouvez spécifier l'encodage:

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

Une fois la lecture du fichier terminée, le descripteur de fichier doit être fermé:

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

Voir aussi: Lecture d'un fichier dans une variable

Un autre moyen plus rapide de lire un fichier consiste à utiliser File :: Slurper Module. Ceci est utile si vous travaillez avec de nombreux fichiers.

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

Voir aussi: [Lire un fichier avec slurp]

Ecrire dans un fichier

Ce code ouvre un fichier pour l'écriture. Renvoie une erreur si le fichier n'a pas pu être ouvert. Ferme également le fichier à la fin.

#!/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: $!";

Nous avons maintenant un fichier ouvert prêt à être écrit auquel nous accédons via $fh (cette variable s'appelle un descripteur de fichier). Ensuite, nous pouvons diriger la sortie vers ce fichier en utilisant l'opérateur d' print :

# 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: $!";

L'opérateur open a une variable scalaire ( $fh dans ce cas) comme premier paramètre. Comme il est défini dans l'opérateur open , il est traité comme un descripteur de fichier . Le deuxième paramètre ">" (supérieur à) définit que le fichier est ouvert pour écriture. Le dernier paramètre est le chemin du fichier dans lequel écrire les données.

Pour écrire les données dans le fichier, l'opérateur d' print est utilisé avec le descripteur de fichier. Notez que dans l'opérateur d' print , il n'y a pas de virgule entre le descripteur de fichier et l'instruction elle-même, juste un espace.

Ouvrir un fichier FileHandle pour la lecture

Ouverture de fichiers texte ASCII génériques

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

Ceci est l'idiome de base pour "défaut" File IO et fait de $filehandle un flux d' bytes entrée lisible, filtré par un décodeur spécifique au système par défaut, qui peut être défini localement avec le pragma open

Perl lui-même ne gère pas les erreurs lors de l'ouverture des fichiers. Vous devez donc les gérer vous-même en vérifiant la condition d' open de open . $! est rempli avec le message d'erreur à l'origine de l'échec.

Sous Windows, le décodeur par défaut est un filtre "CRLF", qui mappe toutes les séquences "\ r \ n" de l'entrée à "\ n"

Ouverture de fichiers binaires

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

Cela spécifie que Perl ne doit pas effectuer de traduction CRLF sous Windows.

Ouverture de fichiers texte UTF8

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

Cela spécifie que Perl doit à la fois éviter la traduction CRLF , puis décoder les octets résultants en chaînes de caractères (implémentées en interne sous la forme de tableaux d'entiers pouvant dépasser 255), au lieu de chaînes d' octets

Lecture et écriture dans un fichier

Avant de lire et d'écrire des fichiers texte, vous devez savoir quel encodage utiliser. Consultez la documentation Perl Unicode pour plus de détails sur le codage . Nous montrons ici le réglage de UTF-8 comme codage et décodage par défaut pour la fonction open . Cela se fait en utilisant le pragma open haut de votre code (juste après l’ use strict; et use warnings; serait approprié):

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

La fonction open crée un descripteur de fichier utilisé pour lire et / ou écrire dans un fichier. La fonction open a la signature

open(FILEHANDLE, MODE, FILEPATH) et renvoie une valeur fausse si l'opération échoue. La description de l'erreur est ensuite stockée dans $! .

En train de lire

#!/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!";

L'écriture

#!/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!";

Lecture de morceaux

L'ouverture et la lecture de gros fichiers peuvent prendre du temps et des ressources. Si seulement une petite partie du contenu est requise, il peut être judicieux de lire le contenu en morceaux à l’aide de la fonction de read qui a la signature.

read(FILEHANDLE, SCALAR, LENGTH, OFFSET)

FILEHANDLE doit être un handle de fichier ouvert, SCALAR conservera les données lues après l'opération. LENGTH spécifie le nombre de caractères à lire à partir du OFFSET . La fonction renvoie le nombre de caractères lus, 0 si la fin du fichier a été atteinte et undef en cas d'erreur.

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

Lit 16 caractères depuis le début du fichier dans $data .

"utiliser autodie" et vous n'avez pas besoin de vérifier les échecs d'ouverture / fermeture de fichier

autodie vous permet de travailler avec des fichiers sans avoir à vérifier explicitement les échecs d'ouverture / fermeture.

Depuis Perl 5.10.1, le pragma autodie est disponible dans le noyau Perl. Lorsqu'il est utilisé, Perl vérifie automatiquement les erreurs lors de l'ouverture et de la fermeture des fichiers.

Voici un exemple dans lequel toutes les lignes d'un fichier sont lues puis écrites à la fin d'un fichier journal.

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;

En passant, vous devriez toujours vérifier techniquement print instructions print . Beaucoup de gens ne le font pas, mais perl (l'interpréteur Perl) ne le fait pas automatiquement, pas plus autodie .

Rembobiner un descripteur de fichier

Parfois, il est nécessaire de revenir en arrière après avoir lu.

# 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;

Lecture et écriture de fichiers compressés gzip

Ecrire un fichier compressé

Pour écrire un fichier compressé, use le module IO::Compress::Gzip et créez un descripteur de fichier en créant une nouvelle instance de IO::Compress::Gzip pour le fichier de sortie souhaité:

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;

Lecture d'un fichier compressé

Pour lire un fichier compressé, use le module IO::Uncompress::Gunzip , puis créez un descripteur de fichier en créant une nouvelle instance de IO::Uncompress::Gunzip pour le fichier d'entrée:

#!/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;

Définition du codage par défaut pour IO

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

Ce pragma change le mode par défaut de lecture et d'écriture du texte (fichiers, entrée standard, sortie standard et erreur standard) en UTF-8, ce qui correspond généralement à ce que vous souhaitez lors de l'écriture de nouvelles applications.

ASCII est un sous-ensemble de UTF-8, ce qui ne devrait pas poser de problème avec les fichiers ASCII hérités et vous aidera à vous protéger contre la corruption accidentelle de fichiers pouvant survenir lors du traitement de fichiers UTF-8 en ASCII.

Cependant, il est important que vous sachiez quel est l’encodage de vos fichiers et que vous les gériez en conséquence. ( Raisons pour lesquelles nous ne devrions pas ignorer Unicode. ) Pour un traitement plus approfondi d'Unicode, veuillez consulter la rubrique Perl Unicode .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow