Quelle est la meilleure façon d'ouvrir et de lire un fichier en Perl?
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. Je suis juste intéressé de savoir quelle façon la plupart des gens utilisent, et peut-être apprendre quelques nouvelles méthodes en même temps :)*
Très commun de 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 d'une parenthèse 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?
- Le perlopentut de la page de manuel couvre la plupart de ce problème assez bien.
Vous devez vous connecter pour publier un commentaire.
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: est-ce
Les raisons sont:
La suite est grande si le fichier est petit et vous savez que vous voulez toutes les lignes:
Vous pouvez même le faire, si vous avez besoin de traiter toutes les lignes comme une seule chaîne:
Pour les longs fichiers que vous voulez pour effectuer une itération sur les lignes avec tout, ou utiliser la lecture.
File::Slurp
ouTie::File
.use autodie;
qui feront de vos opérations d'e / s mortels par défaut. Plus facile que d'écrire "ou mourir" partout.Si vous voulez que le fichier entier comme une seule chaîne de caractères, il n'est pas nécessaire d'itérer à travers elle.
Ci-dessus satisfait
perlcritic --brutal
, ce qui est un bon moyen de tester les "meilleures pratiques":).$input_file
est toujours pas défini ici, mais le reste est casher.$RS
est le même que$/
quiEnglish
met en place pour vous.$/
est la variable qui suit larow seperator
valeur pour<$fh>
, qui est synonyme de la notion deget-line
, ou$fh->getline()
. Essentiellement, il contient la valeur interne de lire algorithme utilise pour savoir quand il a lu un pleinline
de données, et de mettre ce paramètre àundef
signifie "il n'y a pas de marqueur qui indique une ligne complète" de sorte qu'il lit dans le fichier entier comme une "ligne"Avoir à écrire "ou la mort" partout me pousse à la noix. Mon préféré d'ouvrir un fichier ressemble à ceci:
Alors que c'est 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 d'écrire un
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-argumentopen
à 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 de fichiers. 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'un 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.Si vos fichiers sont suffisamment petits pour que la lecture de toute la chose dans la mémoire est possible, utilisez Fichier::Slurp. Il lit et écrit les fichiers complets avec un très API simple, plus il effectue toutes les vérification d'erreur si vous n'avez pas à.
Il n'y a pas de meilleur moyen pour ouvrir et lire un fichier. C'est pas la bonne question à se poser. Ce qui est dans le fichier? Quelle quantité de données que vous avez besoin à tout moment? Avez-vous besoin de toutes les données à la fois? Que devez-vous faire avec ces données? Vous avez besoin de trouver des personnes avant de penser à la façon dont vous avez besoin pour ouvrir et lire le fichier.
Est tout ce que vous faites maintenant vous cause des problèmes? Si non, vous n'avez pas mieux les problèmes à résoudre? 🙂
Plus de votre question est simplement de la syntaxe, et qui tous ont répondu dans la documentation Perl (en particulier (perlopentut). Vous pouvez également ramasser L'Apprentissage De Perl, qui répond à la plupart des problèmes que vous avez dans votre question.
Bonne chance 🙂
C'est vrai qu'il y a comme un grand nombre des meilleures façons d'ouvrir un fichier en Perl comme il y a
...mais c'est toujours intéressant de voir qui habituellement t-il la voie. Ma forme préférée de siphonage (lecture de l'ensemble de fichiers à la fois) est:
Et quand aller ligne par ligne:
Caveat lector de cours: ce sont des approches que je leur ai promis de muscle de la mémoire de travail de tous les jours, et ils peuvent être radicalement inadapté pour le problème que vous essayez de résoudre.
Pour OO, j'aime:
Une fois, j'ai utilisé le
réutilisable régulièrement. Aujourd'hui, j'utilise
File::Slurp
pour les petits fichiers que je veux la tenir entièrement dans la mémoire, etTie::File
pour les gros fichiers que je veux de manière échelonnée adresse et/ou les fichiers que je veux changer de place.Lire l'intégralité du fichier $fichier dans la variable $texte avec une seule ligne
ou comme une fonction
Si ces programmes sont juste pour votre productivité, tout ce qui fonctionne! Construire en autant d'erreur de manipulation que vous pensez que vous avez besoin.
Lecture dans un fichier entier si c'est important peut-être pas le meilleur moyen à long terme de faire des choses, de sorte que vous pouvez les lignes de production à mesure qu'ils sont plutôt que de les charger dans un tableau.
Une astuce que j'ai reçu de l'un des chapitres de La Pragmatique Programmeur (Hunt & Thomas) est ce que vous pourriez voulez avoir le script enregistrer une copie de sauvegarde du fichier pour vous avant qu'il se met au travail, trancher et couper en dés.
La
||
opérateur a une priorité plus élevée, de sorte qu'il est évalué en premier, avant d'envoyer le résultat à "ouvrir"... Dans le code que vous avez mentionné, utilisez l'opérateur "ou" à la place, et tu n'aurais pas ce problème.Damian Conway est-il de cette façon:
Mais je ne le recommande pas pour vous.