44 votes

Quel est le meilleur moyen d'ouvrir et de lire un fichier en Perl?

Edit sur 11/26 - Veuillez noter que je ne suis pas à la recherche de la "bonne" façon d'ouvrir/lire un fichier, ou la façon dont je devrais ouvrir/lire un fichier à chaque fois. J'étais juste intéressé pour savoir de quelle façon la plupart des gens utilisent, et peut-être apprendre quelques nouvelles méthodes en même temps :)

Un très commune bloc de code de mes programmes perl est l'ouverture d'un fichier et de la lecture ou de l'écriture pour elle. J'ai vu tellement de façons de le faire, et mon style sur la réalisation de cette tâche a changé au fil des ans un certain nombre de fois. Je me demandais simplement ce que le meilleur (si il y a une meilleure façon) la méthode est de faire cela?

J'ai utilisé pour ouvrir un fichier comme ceci:

my $input_file = "/path/to/my/file";
open INPUT_FILE, "<$input_file"  || die "Can't open $input_file: $!\n";

mais je pense qui a des problèmes avec la récupération d'erreur.

L'ajout de parenthèses semble corriger l'erreur de piégeage:

open (INPUT_FILE, "<$input_file")  || die "Can't open $input_file: $!\n";

Je sais que vous pouvez également attribuer un descripteur de fichier à une variable, donc au lieu d'utiliser "INPUT_FILE" comme je l'ai fait ci-dessus, j'aurais pu utiliser $input_filehandle - est de cette façon mieux?

Pour la lecture d'un fichier, si il est petit, il n'y a rien de mal avec d'expansion, comme ça?

my @array = <INPUT_FILE>;

ou

my $file_contents = join( "\n", <INPUT_FILE> );

ou devriez-vous toujours en boucle, comme ceci:

my @array;
while (<INPUT_FILE>) {
  push(@array, $_);
}

Je sais qu'il y a de nombreuses façons d'accomplir des choses en perl, je me demandais simplement si il y a des privilégiés/des méthodes standard de l'ouverture et de la lecture dans un fichier?

59voto

JSBձոգչ Points 25069

Il n'existe pas de normes universelles, mais il y a des raisons de préférer l'un ou l'autre. Ma forme préférée est ceci:

open( my $input_fh, "<", $input_file ) || die "Can't open $input_file: $!";

Les raisons sont les suivantes:

  • Vous signalez immédiatement les erreurs. (Remplacer "mourir" à "avertir" si c'est ce que vous voulez.)
  • Votre descripteur de fichier est maintenant de référence-compté, donc une fois que vous ne l'utilisez pas, il sera automatiquement fermé. Si vous utilisez le nom global INPUT_FILEHANDLE, alors vous devez fermer le fichier manuellement ou il restera ouvert jusqu'à ce que le programme se termine.
  • La lecture de l'indicateur "<" est séparé de l' $input_file, l'augmentation de la lisibilité.

La suite est grande si le fichier est petit et vous savez que vous voulez toutes les lignes:

my @lines = <$input_fh>;

Vous pouvez même le faire, si vous avez besoin de traiter toutes les lignes comme une seule chaîne:

my $text = join('', <$input_fh>);

Pour les longs fichiers que vous voulez pour effectuer une itération sur les lignes avec tout, ou utiliser la lecture.

15voto

Kent Fredric Points 35592

Si vous voulez que le fichier entier soit une seule chaîne, il n’est pas nécessaire de le parcourir.

 use strict;
use warnings;
use Carp;
use English qw( -no_match_vars ); 
my $data = q{}; 
{ 
   local $RS = undef; # this makes it just read the whole thing,
   my $fh; 
   croak "Can't open $input_file: $!\n" if not open $fh, '<', $input_file;
   $data = <$fh>; 
   croak 'Some Error During Close :/ ' if not close $fh;
}
 

Edit: Ce qui précède satisfait maintenant perlcritic --brutal , ce qui est un bon moyen de tester les "meilleures pratiques" :). $ input_file est toujours indéfini ici, mais le reste est casher.

14voto

pjf Points 4685

Avoir à écrire "ou la mort" partout me pousse à la noix. Mon préféré d'ouvrir un fichier ressemble à ceci:

use autodie;

open(my $image_fh, '<', $filename);

Bien que très peu de frappe, il y a beaucoup de choses importantes à noter qui sont en cours:

  • Nous sommes à l'aide de la autodie pragma, ce qui signifie que tous Perl intégré-ins va lever une exception si quelque chose va mal. Il élimine le besoin pour la rédaction or die ... dans votre code, il produit de l'amicale, lisible par l'homme, les messages d'erreur, et l'a portée lexicale. Il est disponible sur le CPAN.

  • Nous utilisons les trois-argument version de open. Cela signifie que même si nous avons un drôle de nom de fichier contenant des caractères tels que <, > ou |, perl va toujours faire la bonne chose. Dans mon Perl Sécurité tutoriel à OSCON j'ai montré un certain nombre de façons d'obtenir 2-argument ouvert à mal se conduire. Les billets pour ce tutoriel sont disponibles pour téléchargement gratuit à partir de Perl Formation de l'Australie.

  • Nous sommes à l'aide d'un scalaire descripteur de fichier. Cela signifie que nous n'allons pas être une coïncidence de clôture de quelqu'un d'autre descripteur de fichier du même nom, ce qui peut arriver si nous utilisons paquet de descripteurs. Il signifie aussi strict pouvez repérer les fautes de frappe, et que notre descripteur de fichier sera nettoyé automatiquement si elle est hors de portée.

  • Nous sommes à l'aide d'une significative descripteur de fichier, dans ce cas, il semble bien que nous allons écrire à une image.

  • Le descripteur de fichier se termine avec _fh. Si nous nous voir en l'utilisant comme un scalaire, alors nous savons que c'est probablement une erreur.

Tous les meilleurs,

Paul

11voto

Dave Rolsky Points 3659

Si vos fichiers sont suffisamment petits pour pouvoir tout lire en mémoire, utilisez File :: Slurp . Il lit et écrit des fichiers complets avec une API très simple. En outre, il vérifie toutes les erreurs pour que vous n'ayez pas à le faire.

7voto

converter42 Points 3264

La page de manuel perlopentut couvre assez bien la majeure partie de cette question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X