Opérations sur les fichiers en Perl

Perl utilise un type de variable appelé handle de fichier pour manipuler des fichiers.

La lecture ou l'écriture de données depuis un fichier nécessite un handle de fichier.

Le handle de fichierest unI/Onom d'une connexion.

Perl fournit trois handles de fichier :STDIN,STDOUT,STDERRqui représentent respectivementl'entrée standard、la sortie standardetla sortie d'erreur standard。

En Perl, les fichiers peuvent être ouverts des manières suivantes :

open FILEHANDLE, EXPR
open FILEHANDLE

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

Description du paramètre :

  • FILEHANDLE : Le handle de fichier, utilisé pour stocker un identifiant unique pour un fichier.
  • EXPR : Une expression composée du nom de fichier et du type d'accès au fichier.
  • MODE : Type d'accès au fichier.
  • PERMS : Bits de permission.

Fonction open

Dans le code suivant, nous utilisons la fonction open en mode lecture seule<pour ouvrir le fichier file.txt :

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

<indique le mode lecture seule.

DATA dans le code est le descripteur de fichier utilisé pour lire le fichier. L'exemple suivant ouvre le fichier et affiche son contenu :

Exemple

#!/usr/bin/perl open(DATA, "<file.txt") or die "Le fichier file.txt ne peut pas être ouvert,$!"; while(<DATA>){ print "$_"; }

Le code suivant ouvre le fichier file.txt en mode écriture>:

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

>indique le mode écriture.

Si vous avez besoin d'ouvrir un fichier en mode lecture-écriture, vous pouvez ajouter un signe + avant le caractère > ou < :

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

Ce mode ne supprime pas le contenu original du fichier. Si vous voulez les supprimer, le format est le suivant :

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

Si vous voulez ajouter des données à un fichier, il vous suffit d'ouvrir le fichier en mode ajout avant d'ajouter les données :

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

>>indique l'ajout de données à la fin d'un fichier existant. Si vous devez lire le contenu du fichier en cours d'ajout, vous pouvez ajouter un signe + :

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

Le tableau suivant répertorie les différents modes d'accès :

ModeDescription
< ou rOuvrir en mode lecture seule, en plaçant le pointeur de fichier au début du fichier.
> ou wOuvrir en mode écriture, en plaçant le pointeur de fichier au début du fichier et en tronquant la taille du fichier à zéro. Si le fichier n'existe pas, essayez de le créer.
>> ou aOuvrir en mode écriture, en plaçant le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, essayez de le créer.
+< ou r+Ouvrir en mode lecture-écriture, en plaçant le pointeur de fichier au début du fichier.
+> ou w+Ouvrir en mode lecture-écriture, en plaçant le pointeur de fichier au début du fichier et en tronquant la taille du fichier à zéro. Si le fichier n'existe pas, essayez de le créer.
+>> ou a+Ouvrir en mode lecture-écriture, en positionnant le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, essayez de le créer.

Fonction Sysopen

sysopenCette fonction est similaire à la fonction open, sauf que leurs formes de paramètres sont différentes.

L'exemple suivant ouvre un fichier en mode lecture-écriture (+<filename) :

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

Si vous devez vider le fichier avant de le mettre à jour, la syntaxe est la suivante :

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

Vous pouvez utiliser O_CREAT pour créer un nouveau fichier, O_WRONLY pour le mode écriture seule, et O_RDONLY pour le mode lecture seule.

Le paramètre PERMSest une valeur d'attribut octale, indiquant les permissions après la création du fichier. La valeur par défaut est0x666。

Le tableau suivant répertorie les valeurs de mode possibles :

ModeDescription
O_RDWROuvrir en mode lecture-écriture, en plaçant le pointeur de fichier au début du fichier.
O_RDONLYOuvrir en mode lecture seule, en plaçant le pointeur de fichier au début du fichier.
O_WRONLYOuvrir en mode écriture, en plaçant le pointeur de fichier au début du fichier et en tronquant la taille du fichier à zéro. Si le fichier n'existe pas, essayez de le créer.
O_CREATCréer un fichier
O_APPENDAjouter au fichier
O_TRUNCTronquer la taille du fichier à zéro
O_EXCL Si le fichier existe lorsque O_CREAT est utilisé, un message d'erreur est renvoyé ; il peut tester si le fichier existe.
O_NONBLOCKLes E/S non bloquantes font que notre opération réussit ou renvoie immédiatement une erreur sans être bloquée.

Fonction Close

Après avoir utilisé un fichier, vous devez le fermer pour vider les tampons d'entrée/sortie associés au descripteur de fichier. La syntaxe pour fermer un fichier est la suivante :

close FILEHANDLE
close

FILEHANDLE est le descripteur de fichier spécifié ; il renvoie vrai si la fermeture réussit.

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

Lecture et écriture de fichiers

Il existe plusieurs façons différentes de lire et d'écrire des informations depuis des fichiers ou vers ceux-ci :

Opérateur <FILEHANDL>

La méthode principale pour lire des informations à partir d'un descripteur de fichier ouvert est l'opérateur <FILEHANDLE>. En contexte scalaire, il renvoie une seule ligne du descripteur de fichier. Par exemple :

Exemple

#!/usr/bin/perl print "URL du tutoriel d'exemple ?\n"; $name = <STDIN>; print "Site web :$name\n";

Après l'exécution du programme ci-dessus, les informations suivantes seront affichées. Après avoir saisi l'URL, l'instruction print affichera :

Lorsque nous utilisons l'opérateur <FILEHANDLE>, il renvoie une liste de chaque ligne du descripteur de fichier. Par exemple, nous pouvons importer toutes les lignes dans un tableau.

Créez d'abord le fichier import.txt avec le contenu suivant :

$ cat import.txt 
1
2
3

Lisez import.txt et placez chaque ligne dans le tableau @lines :

Exemple

#!/usr/bin/perl open(DATA,"<import.txt") or die "Impossible d'ouvrir les données"; @lines = <DATA>; print @lines; # Afficher le contenu du tableau close(DATA);

Après avoir exécuté le programme ci-dessus, la sortie est :

1
2
3

Fonction getc

La fonction getc renvoie un seul caractère depuis le FILEHANDLE spécifié, ou depuis STDIN si aucun n'est spécifié :

getc FILEHANDLE
getc

Si une erreur se produit, ou si le descripteur de fichier est à la fin du fichier, elle renvoie undef.


Fonction read

La fonction read est utilisée pour lire des informations à partir d'un handle de fichier tamponné.

Cette fonction est utilisée pour lire des données binaires depuis un fichier.

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

Description du paramètre :

  • FILEHANDLE : Le handle de fichier, utilisé pour stocker un identifiant unique pour un fichier.
  • SCALAR : stocke le résultat. Si OFFSET n'est pas spécifié, les données sont placées au début de SCALAR. Sinon, les données sont placées après OFFSET octets dans SCALAR.
  • LENGTH : la longueur du contenu à lire.
  • OFFSET : le décalage.

En cas de succès, retourne le nombre d'octets lus ; retourne 0 à la fin du fichier ; retourne undef si une erreur se produit.

Fonction print

Pour toutes les fonctions qui lisent des informations depuis un handle de fichier, la principale fonction d'écriture sous-jacente est print :

print FILEHANDLE LIST
print LIST
print

En utilisant le handle de fichier et la fonction print, les résultats du programme peuvent être envoyés vers le périphérique de sortie (STDOUT : sortie standard), par exemple :

print "Hello World!\n";

Copie de fichier

Dans l'exemple suivant, nous allons ouvrir un fichier existant file1.txt, lire chacune de ses lignes et les écrire dans file2.txt :

Exemple

#!/usr/bin/perl # Ouvrir le fichier en mode lecture seule open(DATA1, "<file1.txt"); # Ouvrir un nouveau fichier et écrire open(DATA2, ">file2.txt"); # Copier les données while(<DATA1>) { print DATA2 $_; } close( DATA1 ); close( DATA2 );

Renommage de fichier

Dans l'exemple suivant, nous renommons le fichier existant file1.txt en file2.txt, dans le répertoire spécifié /usr/example/test/ :

#!/usr/bin/perl

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

La fonctionrenamesaccepte uniquement deux paramètres et ne renomme que les fichiers existants.

Suppression de fichiers

Dans l'exemple suivant, nous montrons comment utiliser la fonctionunlinkpour supprimer un fichier :

Exemple

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

Spécification de la position dans le fichier

Vous pouvez utiliser la fonctiontellpour obtenir la position du fichier, et utiliser la fonctionseekpour spécifier la position dans le fichier :

Fonction tell

La fonction tell est utilisée pour obtenir la position du fichier:

tell FILEHANDLE
tell

Si FILEHANDLE est spécifié, la fonction renvoie la position du pointeur de fichier en octets. Si non spécifié, elle renvoie le handle de fichier sélectionné par défaut.

Fonction seek

La fonction seek() lit ou écrit dans les fichiers en déplaçant le pointeur de lecture/écriture du fichier via le handle de fichier, en lisant et écrivant en octets:

seek FILEHANDLE, POSITION, WHENCE

Description du paramètre :

  • FILEHANDLE: handle de fichier, utilisé pour stocker un identifiant unique pour un fichier.
  • POSITION: Indique le nombre d'octets dont le handle de fichier (pointeur de position lecture/écriture) doit se déplacer.
  • WHENCE: Indique la position de départ lorsque le handle de fichier (pointeur de position lecture/écriture) commence à se déplacer. Il peut prendre les valeurs 0, 1, 2; représentant respectivement le début du fichier, la position actuelle et la fin du fichier.

L'exemple suivant lit 256 octets depuis le début du fichier:

seek DATA, 256, 0;

Informations sur le fichier

Les opérations de fichier de Perl peuvent également d'abord tester si un fichier existe, s'il est lisible ou inscriptible, etc.

Nous pouvons d'abord créer un fichier file1.txt, avec le contenu suivant:

$ cat file1.txt 
www.example.com

Exemple

#/usr/bin/perl my $file = "/usr/test/example/file1.txt"; my (@description, $size); if (-e $file) { push @description, 'Est un fichier binaire' if (-B _); push @description, 'Est une socket' if (-S _); push @description, 'Est un fichier texte' if (-T _); push @description, 'Est un fichier spécial bloc' if (-b _); push @description, 'Est un fichier spécial caractère' if (-c _); push @description, 'Est un répertoire' if (-d _); push @description, 'Le fichier existe' if (-x _); push @description, (($size = -s _)) ? "$sizebytes" : 'Vide'; print "$fileInformations :", join(', ',@description),"\n"; }

Après l'exécution du programme ci-dessus, la sortie est :

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

Les opérateurs de test de fichier sont présentés dans le tableau suivant :

OperatorDescription
-AHeure du dernier accès au fichier (en jours)
-B Est-ce un fichier binaire
-C Heure de modification du nœud d'index (inode) du fichier (en jours)
-M Heure de la dernière modification du fichier (en jours)
-O Le fichier appartient à l'UID réel
-R Le fichier ou le répertoire peut être lu par l'UID/GID réel
-S Est une socket
-T Est-ce un fichier texte
-W Le fichier ou le répertoire peut être écrit par l'UID/GID réel
-X Le fichier ou le répertoire peut être exécuté par l'UID/GID réel
-b Est un fichier spécial de type bloc (tel qu'un disque monté)
-c Est un fichier spécial de type caractère (tel qu'un périphérique d'E/S)
-d Est un répertoire
-e Le nom de fichier ou de répertoire existe
-f Est un fichier régulier
-g Le fichier ou le répertoire possède l'attribut setgid
-k Le fichier ou le répertoire a le sticky bit positionné
-l Est un lien symbolique
-o Le fichier appartient à l'UID effectif
-p Le fichier est un tube nommé (FIFO)
-r Le fichier peut être lu par l'UID/GID effectif
-s Le fichier ou le répertoire existe et n'est pas 0 (retourne le nombre d'octets)
-t Le descripteur de fichier est un TTY (retourne le résultat de la fonction système isatty() ; ce test ne peut pas être utilisé sur un nom de fichier)
-u Le fichier ou le répertoire possède l'attribut setuid
-w Le fichier peut être écrit par l'UID/GID effectif
-x Le fichier peut être exécuté par l'UID/GID effectif
-zLe fichier existe, sa taille est 0 (les répertoires sont toujours faux), c'est-à-dire s'il s'agit d'un fichier vide
Autres extensions