Perl - E / S de fichier

Les bases de la gestion des fichiers sont simples: vous associez un filehandle avec une entité externe (généralement un fichier), puis utilisez une variété d'opérateurs et de fonctions dans Perl pour lire et mettre à jour les données stockées dans le flux de données associé au descripteur de fichier.

Un descripteur de fichier est une structure Perl interne nommée qui associe un fichier physique à un nom. Tous les descripteurs de fichiers sont capables d'un accès en lecture / écriture, de sorte que vous pouvez lire et mettre à jour tout fichier ou périphérique associé à un descripteur de fichier. Cependant, lorsque vous associez un descripteur de fichier, vous pouvez spécifier le mode dans lequel le descripteur de fichier est ouvert.

Trois descripteurs de fichiers de base sont - STDIN, STDOUT, et STDERR, qui représentent respectivement les périphériques d'entrée standard, de sortie standard et d'erreur standard.

Ouverture et fermeture de fichiers

Il y a deux fonctions suivantes avec plusieurs formes, qui peuvent être utilisées pour ouvrir n'importe quel fichier nouveau ou existant en Perl.

open FILEHANDLE, EXPR
open FILEHANDLE

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

Ici FILEHANDLE est le descripteur de fichier renvoyé par le open function et EXPR est l'expression ayant le nom de fichier et le mode d'ouverture du fichier.

Fonction ouverte

Voici la syntaxe pour ouvrir file.txten mode lecture seule. Ici, moins de <signe indique que le fichier doit être ouvert en mode lecture seule.

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

Ici, DATA est le descripteur de fichier, qui sera utilisé pour lire le fichier. Voici l'exemple, qui ouvrira un fichier et imprimera son contenu sur l'écran.

#!/usr/bin/perl

open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";

while(<DATA>) {
   print "$_";
}

Voici la syntaxe pour ouvrir file.txt en mode écriture. Ici, le signe inférieur à> indique que le fichier doit être ouvert en mode d'écriture.

open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";

Cet exemple tronque (vide) le fichier avant de l'ouvrir pour l'écriture, ce qui peut ne pas être l'effet souhaité. Si vous souhaitez ouvrir un fichier en lecture et en écriture, vous pouvez mettre un signe plus avant les caractères> ou <.

Par exemple, pour ouvrir un fichier à mettre à jour sans le tronquer -

open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";

Pour tronquer d'abord le fichier -

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

Vous pouvez ouvrir un fichier en mode ajout. Dans ce mode, le point d'écriture sera défini à la fin du fichier.

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

Un double >> ouvre le fichier à ajouter, en plaçant le pointeur de fichier à la fin, de sorte que vous pouvez immédiatement commencer à ajouter des informations. Cependant, vous ne pouvez pas le lire sauf si vous placez également un signe plus devant lui -

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

Voici le tableau, qui donne les valeurs possibles des différents modes

N ° Sr. Entités et définition
1

< or r

Accès en lecture seule

2

> or w

Crée, écrit et tronque

3

>> or a

Écrit, ajoute et crée

4

+< or r+

Lit et écrit

5

+> or w+

Lit, écrit, crée et tronque

6

+>> or a+

Lit, écrit, ajoute et crée

Fonction Sysopen

le sysopen La fonction est similaire à la fonction ouverte principale, sauf qu'elle utilise le système open() fonction, en utilisant les paramètres qui lui sont fournis comme paramètres de la fonction système -

Par exemple, pour ouvrir un fichier à mettre à jour, émuler le +<filename format ouvert -

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

Ou pour tronquer le fichier avant la mise à jour -

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

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

le PERMSL'argument spécifie les autorisations de fichier pour le fichier spécifié, s'il doit être créé. Par défaut, il faut0x666.

Voici le tableau qui donne les valeurs possibles de MODE.

N ° Sr. Entités et définition
1

O_RDWR

Lire et écrire

2

O_RDONLY

Lecture seulement

3

O_WRONLY

Écriture seulement

4

O_CREAT

Créer le fichier

5

O_APPEND

Ajouter le fichier

6

O_TRUNC

Tronquer le fichier

sept

O_EXCL

S'arrête si le fichier existe déjà

8

O_NONBLOCK

Utilisation non bloquante

Fermer la fonction

Pour fermer un descripteur de fichier, et donc dissocier le descripteur de fichier du fichier correspondant, vous utilisez le closefonction. Cela vide les tampons du descripteur de fichier et ferme le descripteur de fichier du système.

close FILEHANDLE
close

Si aucun FILEHANDLE n'est spécifié, il ferme le descripteur de fichier actuellement sélectionné. Il renvoie true uniquement s'il parvient à vider les tampons et à fermer le fichier.

close(DATA) || die "Couldn't close file properly";

Lecture et écriture de fichiers

Une fois que vous avez un descripteur de fichier ouvert, vous devez être capable de lire et d'écrire des informations. Il existe différentes manières de lire et d'écrire des données dans le fichier.

L'opérateur <FILEHANDL>

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

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

Lorsque vous utilisez l'opérateur <FILEHANDLE> dans un contexte de liste, il renvoie une liste de lignes à partir du descripteur de fichier spécifié. Par exemple, pour importer toutes les lignes d'un fichier dans un tableau -

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

Fonction getc

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

getc FILEHANDLE
getc

S'il y a eu une erreur ou si le descripteur de fichier est à la fin du fichier, undef est renvoyé à la place.

fonction de lecture

La fonction de lecture lit un bloc d'informations à partir du descripteur de fichier mis en mémoire tampon: Cette fonction est utilisée pour lire les données binaires du fichier.

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

La longueur des données lues est définie par LENGTH, et les données sont placées au début de SCALAR si aucun OFFSET n'est spécifié. Sinon, les données sont placées après les octets OFFSET dans SCALAR. La fonction renvoie le nombre d'octets lus en cas de succès, zéro à la fin du fichier ou undef s'il y a eu une erreur.

Fonction d'impression

Pour toutes les différentes méthodes utilisées pour lire les informations à partir des descripteurs de fichiers, la fonction principale de réécriture des informations est la fonction d'impression.

print FILEHANDLE LIST
print LIST
print

La fonction d'impression imprime la valeur évaluée de LIST dans FILEHANDLE ou dans le descripteur de fichier de sortie actuel (STDOUT par défaut). Par exemple -

print "Hello World!\n";

Copie de fichiers

Voici l'exemple, qui ouvre un fichier existant file1.txt et le lit ligne par ligne et génère une autre copie de fichier file2.txt.

#!/usr/bin/perl

# Open file to read
open(DATA1, "<file1.txt");

# Open new file to write
open(DATA2, ">file2.txt");

# Copy data from one file to another.
while(<DATA1>) {
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

Renommer un fichier

Voici un exemple qui montre comment renommer un fichier file1.txt en file2.txt. En supposant que le fichier soit disponible dans le répertoire / usr / test.

#!/usr/bin/perl

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

Cette fonction renames prend deux arguments et renomme simplement le fichier existant.

Supprimer un fichier existant

Voici un exemple qui montre comment supprimer un fichier file1.txt à l'aide du unlink fonction.

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

Positionnement dans un fichier

Vous pouvez utiliser pour tell fonction pour connaître la position actuelle d'un fichier et seek pour pointer une position particulière dans le fichier.

dire Fonction

La première condition est de trouver votre position dans un fichier, ce que vous faites en utilisant la fonction tell -

tell FILEHANDLE
tell

Cela renvoie la position du pointeur de fichier, en octets, dans FILEHANDLE si spécifié, ou le descripteur de fichier sélectionné par défaut actuel si aucun n'est spécifié.

Fonction de recherche

La fonction de recherche positionne le pointeur de fichier sur le nombre d'octets spécifié dans un fichier -

seek FILEHANDLE, POSITION, WHENCE

La fonction utilise la fonction système fseek et vous avez la même capacité à vous positionner par rapport à trois points différents: le début, la fin et la position actuelle. Pour ce faire, spécifiez une valeur pour WHENCE.

Zéro définit le positionnement par rapport au début du fichier. Par exemple, la ligne définit le pointeur de fichier sur le 256e octet du fichier.

seek DATA, 256, 0;

Informations sur le fichier

Vous pouvez tester certaines fonctionnalités très rapidement dans Perl en utilisant une série d'opérateurs de test connus collectivement sous le nom de tests -X. Par exemple, pour effectuer un test rapide des différentes autorisations sur un fichier, vous pouvez utiliser un script comme celui-ci -

#/usr/bin/perl

my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
   push @description, 'binary' if (-B _);
   push @description, 'a socket' if (-S _);
   push @description, 'a text file' if (-T _);
   push @description, 'a block special file' if (-b _);
   push @description, 'a character special file' if (-c _);
   push @description, 'a directory' if (-d _);
   push @description, 'executable' if (-x _);
   push @description, (($size = -s _)) ? "$size bytes" : 'empty';
   print "$file is ", join(', ',@description),"\n";
}

Voici la liste des fonctionnalités que vous pouvez rechercher pour un fichier ou un répertoire -

N ° Sr. Opérateur et définition
1

-A

Heure de début du script moins heure du dernier accès au fichier, en jours.

2

-B

Est-ce un fichier binaire?

3

-C

Heure de début du script moins l'heure du dernier changement d'inode du fichier, en jours.

3

-M

Heure de début du script moins l'heure de modification du fichier, en jours.

4

-O

Le fichier appartient-il au véritable ID utilisateur?

5

-R

Le fichier est-il lisible par l'ID utilisateur réel ou le groupe réel?

6

-S

Le fichier est-il une socket?

sept

-T

Est-ce un fichier texte?

8

-W

Le fichier est-il accessible en écriture avec l'ID utilisateur réel ou le groupe réel?

9

-X

Le fichier est-il exécutable par l'ID utilisateur réel ou le groupe réel?

dix

-b

S'agit-il d'un fichier spécial de bloc?

11

-c

S'agit-il d'un fichier spécial de caractère?

12

-d

Le fichier est-il un répertoire?

13

-e

Le fichier existe-t-il?

14

-f

Est-ce un fichier simple?

15

-g

Le fichier a-t-il le bit setgid défini?

16

-k

Le fichier a-t-il le bit collant défini?

17

-l

Le fichier est-il un lien symbolique?

18

-o

Le fichier appartient-il à l'ID utilisateur effectif?

19

-p

Le fichier est-il un tube nommé?

20

-r

Le fichier est-il lisible par l'utilisateur effectif ou l'ID de groupe?

21

-s

Renvoie la taille du fichier, taille zéro = fichier vide.

22

-t

Le descripteur de fichier est-il ouvert par un TTY (terminal)?

23

-u

Le fichier a-t-il le bit setuid défini?

24

-w

Le fichier est-il accessible en écriture par l'ID d'utilisateur ou de groupe effectif?

25

-x

Le fichier est-il exécutable par l'ID d'utilisateur ou de groupe effectif?

26

-z

La taille du fichier est-elle nulle?