2010-11-03 6 views
11

Mögliche Duplizieren:
What is the best way to slurp a file into a string in Perl?Read-Datei in die Variable in Perl

Ist dieser Code eine gute Möglichkeit, den Inhalt einer Datei in eine Variable in Perl zu lesen? Es funktioniert, aber ich bin neugierig, ob es eine bessere Praxis gibt, die ich verwenden sollte.

open INPUT, "input.txt"; 
undef $/; 
$content = <INPUT>; 
close INPUT; 
$/ = "\n"; 
+0

Das ist kein guter Code. Das ist besser: 'open (my $ fh," <: encoding (UTF-8) "," input.text ") || die "kann nicht öffnen input.text: $!"; $ content = do {local $ /; <$fh>}; schließen ($ fh) || sterben "kann nicht schließen input.text: $!"; ' – tchrist

Antwort

26

Ich glaube, gängige Praxis, so etwas wie dieses:

my $content; 
    open(my $fh, '<', $filename) or die "cannot open file $filename"; 
    { 
     local $/; 
     $content = <$fh>; 
    } 
    close($fh); 

Mit 3 Argument open sicherer ist. Die Verwendung von Datei-Handle als Variable ist, wie es in modernen Perl verwendet werden sollte und die Verwendung von local $/ stellt den Anfangswert von $/ am Blockende statt Ihrer fest codierten \n wieder her.

+1

Siehe http://search.cpan.org/dist/File-Slurp/extras/slurp_article.pod –

2

Beachten Sie, wenn Sie in einer Umgebung sind, wo Installation der Module möglich ist, Sie IO::All verwenden möchten:

use IO::All; 
my $contents; 
io('file.txt') > $contents; 

Einige der Möglichkeiten ein bisschen verrückt, aber sie können auch ganz nützlich sein.

+0

Ein Nicht-Standard-Modul plus ein leicht überladenes'> 'Operator, nur um eine Datei zu lesen, etwas, was jeder Perl-Programmierer im Schlaf tun könnte, scheint, als würde es ziemlich weit über Bord gehen. – tchrist

+1

Tchrist, Überladung ist nicht das Problem, [HTTP mit lokalen Dateizugriff a la PHP "Readfile"] (http://php.net/manual/en/filesystem.configuration.ini#allow-url-fopen) (wir wissen, wie abgründig das war). Aber warum die CPAN-Module hassen? Sie sind Perls Vorteil, [es ist dumm, es nicht zu spielen] (http://stackoverflow.com/q/3700037#3700066). Aber sogar so weit, einen Kampfbegriff gegen sie zu erfinden, das kann nicht gut sein. – daxim

12
use File::Slurp; 
my $content = read_file('input.txt') ; 
+2

Ich bin nicht damit einverstanden, ein Modul zu laden, nur um eine Datei zu öffnen und zu lesen. In der Lage zu sein, Dateien zu öffnen und zu lesen, ist zu grundlegend, um sie nicht sehr gut zu verstehen. – tchrist

+15

Ich stimme nicht überein, endlos die gleichen fünf Zeilen Code immer wieder zu schreiben, wenn man plus ein Modul tut. – Quentin

+4

Es ist nicht einmal ein Standardmodul. Dies verringert die Portabilität des Codes. – tchrist

Verwandte Themen