Comment lire un fichier texte en Perl

De la tâche. Il ya un fichier texte. Besoin de télécharger son contenu dans la variable scalaire dans un programme Perl.

Cette tâche apparaît assez souvent. Par exemple, une telle tâche ne peut se produire pour la lecture des fichiers de configuration ou de petits fichiers de données. Dans ce cas, si vous avez besoin de gérer un fichier, il est préférable de ne pas utiliser cette méthode, mais plutôt d'utiliser le streaming de la lecture du fichier.

La décision. Utiliser la bibliothèque Path::Tiny

La plus simple solution consiste à utiliser la bibliothèque Perl Path::Tiny

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

use Path::Tiny;

my $file_name = 'a.txt';

my $content = path($file_name)->slurp_utf8();

print $content;

Ici path('a.txt') crée un objet de la classe Path::Tiny et ->slurp_utf8() appelle la méthode slurp_utf8 de cet objet. Le résultat dans la variable $content s'affiche tout le contenu du fichier.

C'est une bonne solution, mais il y a une subtilité. Bibliothèque Path::Tiny ne va pas avec Perl, il faut la mettre séparément. Généralement, cela ne pose pas de problème, mais dans certains cas, cette solution ne convient pas.

La décision. Lire le fichier standard de Perl

Cette solution n'est pas commode comme l'utilisation de la bibliothèque Path::Tiny, il faut plus écrire, mais il ne nécessite pas l'installation de bibliothèques supplémentaires.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = '';

open FILE, '<', $file_name or die $!;

while (<FILE>) {
    $content .= $_;
}

print $content;

Avec l'aide de open , nous avons créé un fichier hendler FILE. Lorsque vous travaillez avec open il est important d'utiliser trois arguments, et il est très important d'écrire or die, pas || die. Plus loin à l'aide de while (<FILE>) nous courons à travers le fichier ligne par ligne et mettre tout le contenu dans la variable $content.

Au départ, nous avons attribué la variable $content une chaîne vide ''. Il le faut pour que le code fonctionne correctement en cas de vide de fichiers (si vous n'affectez pas une chaîne vide, dans le cas d'un fichier vide dans la variable $content sera undef).

Dangereuse décision. Utiliser cat

Voici une autre façon que vous pouvez lire le contenu du fichier dans une variable. Cette solution ne nécessite pas de bibliothèques supplémentaires et ne nécessite pas d'écrire de nombreuses lignes de code, mais c'est костыльное solution. Mieux de ne pas écrire. La seule chose quand vous pouvez donc le faire — c'est quand le projet n'est Path::Tany, un travail actif et de vérifier que les autres parties du programme à besoin d'obtenir rapidement le code qui lit le fichier. Mais dans ce cas, il faut à proximité de laisser un commentaire # TODO et, si possible, de supprimer ce code.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = `cat $file_name`;

print $content;

Pourquoi c'est une mauvaise décision. Tout d'abord il n'y pas de gestion des erreurs. Si le fichier n'existe pas, alors AFFICHÉ un avertissement s'affiche cat: asdf: No such file or directory, mais le programme est d'aller plus loin. Deuxièmement il ne fonctionne pas si le nom du fichier contient un espace. Troisièmement, si le contenu de la variable $file_name , nous recevons de l'extérieur il ya une chance qu'il y aura quelque chose comme a.txt; rm -rf / et à l'exception de la lecture du fichier seront remplies d'insécurité de l'action.

Autres articles