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? |