2016-05-19 5 views
-5

Ich habe den folgenden Code, aber kann es in einer Aussage getan werden?Datei in einer Anweisung in eine Zeichenfolge lesen?

open FILE, $file; 
while (<FILE>) { $filestr .= $_; } 
+1

possibl e Duplikat von [In Perl, wie kann ich eine ganze Datei in eine Zeichenkette einlesen?] (http://stackoverflow.com/questions/953707/in-perl-how-can-i-read-an-entire-file- in-a-string) – tadman

+0

Klar eine andere Frage. Ich frage, wie man es in einer Zeile macht. Ich habe bereits den Code zum Lesen in einer Datei in meiner Frage, so klar stelle ich diese Frage nicht. – CJ7

+0

Lesen Sie es in eine Zeichenfolge, entfernen Sie die Zeilenumbrüche. Warum ist das schwer? – tadman

Antwort

4
open FILE, $file; while (<FILE>) { $filestr .= $_; } 

das Vorhandensein eines Newline Allerdings ist die letzte Sache, die mich über diesen Schnipsel kümmern würde. Ich würde mehr Sorgen um die folgenden:

  • Die Verwendung von zwei argument open,
  • der Mangel an Fehler auf dieser open Überprüfung
  • die Verwendung einer globalen Variablen,
  • die Mangel an Verwendung von use strict; und
  • die armen Variablennamen.

open(my $fh, '<', $qfn) 
    or die("Can't open \"$qfn\": $!\n"); 

my $file; { local $/; $file = <$fh>; } 
0

: Es sieht aus wie Sie eine Datei schlürfen wollen, möchten Sie mich das Eingangs voneinander zu trennen sind auf undef?

$ perldoc perlvar # /slurp<enter><copy example code><paste> 
$ perl -E ' 
my $file = "test.txt"; 
my $content = ""; 
open my $fh, "<", $file or die $!; 
{ 
    local $/; 
    $content = <$fh>; 
} 
close $fh; 
print $content;' 

Es wird nie eine Aussage sein. Aber alles kann "eine Zeile Code" in Perl sein.
Also ... wir sind gut, oder? Du meintest keine Schleife, nicht wahr?

Andere Sachen zu beachten:

open my FILE, '<', $file or die $!; 
my @filestrs = <FILE>; 

oder nach cpanm File::Map:

use File::Map qw(map_file); 
map_file my $filestr, $file; 

Ähnlich ist es mit Path::Tiny:

use Path::Tiny; 
my $filestr = path($file)->slurp; # or ->slurp_utf8; 

Sortieren einer Zeile:

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

Weniger Aussagen noch:

open(my $fh, '<', $file); 
read($fh, $filestr, -s $fh); 
0

Ich würde Ihre Frage interpretieren zu:

Wie können die beiden Aussagen, die als einzige Anweisung ohne zusätzliche Module oder Unterroutinen verwenden geschrieben werden.

Perl nicht Sie verhindern, dass sich in den Fuß von der Aufnahme, wenn Sie also Semikolon ist Folgendes zu beachten die Anweisung Separator sein, als eine Anweisung in Betracht gezogen werden könnte:

open (FILE, $file) and do {$filestr .= $_ while (<FILE>)}; 

obwohl es eine implizite ist Semikolon am Ende des do Block, und diese Konstruktion sollte nie in echten Code verwendet werden, da es open Fehler zur Überprüfung der üblichen Art und Weise verhindert:

open (FILE, $file) or die "Could not open file '$file': $!"; 
Verwandte Themen