54 votes

Quel est le meilleur moyen pour siphonner un fichier dans une chaîne en Perl?

Oui, Il y a Plus d'Une Façon De le Faire , mais il doit y avoir un canoniques ou les plus efficaces ou les plus concise. Je vais ajouter des réponses que je connais et voir ce qui percole vers le haut.

Pour être clair, la question est celle de savoir comment lire le contenu d'un fichier dans une chaîne. Une solution pour répondre.

76voto

Leon Timmermans Points 23230

Comment à ce sujet:

use File::Slurp;
my $text = read_file($filename);

47voto

brian d foy Points 71781

J'aime le faire avec un do bloc dans lequel je localiser @ARGV si je peux utiliser le diamant de l'opérateur à faire le fichier de la magie pour moi.

 my $contents = do { local(@ARGV, $/) = $file; <> };

Si vous en avez besoin pour être un peu plus robuste, vous pouvez facilement transformer cela en une sous-routine.

Si vous avez besoin de quelque chose de vraiment solide qui gère toutes sortes de cas particuliers, l'utilisation de Fichier::Slurp. Même si vous n'allez pas l'utiliser, jetez un oeil à la source pour voir tous les farfelus les situations qu'il a à gérer. Fichier::Slurp a un gros problème de sécurité qui n'a pas l'air d'avoir une solution. C'est en partie son incapacité à gérer correctement les encodages. Même ma réponse a ce problème. Si vous avez besoin de gérer l'encodage (peut-être parce que vous ne faites pas tout ce que l'UTF-8 par défaut), cela permet de:

my $contents = do {
    open my $fh, '<:encoding(UTF-8)', $file or die '...';
    <$fh>;
    };

Si vous n'avez pas besoin de modifier le fichier, vous pourriez être en mesure d'utiliser le Fichier::Map.

35voto

Schwern Points 33677

Dans l'écriture de Fichier::Slurp (ce qui est le meilleur moyen), Uri Guttman fait beaucoup de recherches dans les nombreuses manières de siphonage et qui est le plus efficace. Il a écrit ses conclusions ici, et les a incorporés info Fichier::Slurp.

24voto

dreeves Points 9130
open(my $f, '<', $filename) or die "OPENING $filename: $!\n";
$string = do { local($/); <$f> };
close($f);

11voto

Tanktalus Points 7940

Choses à penser (surtout comparé à d'autres solutions):

  1. Descripteurs lexicaux
  2. Réduire la portée
  3. Réduire magie

Donc, je reçois:

my $contents = do {
  local $/;
  open my $fh, $filename or die "Can't open $filename: $!";
  <$fh>
};

Je ne suis pas un grand fan de la magie <> sauf où l'utilisation de la magie <>. Au lieu de faire semblant, pourquoi ne pas simplement utiliser l'appel d'offres ouvert directement? Il n'est pas beaucoup plus de travail, et est explicite. (Vraie magie <>, surtout lors de la manipulation des "-", est beaucoup plus de travail pour parfaitement l'imiter, mais nous ne l'utilisons pas ici de toute façon.)

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