2013-08-21 7 views
10

Sie können Dateigriffe im Speicher öffnen?Öffnen von Dateien In-Memory bedeutet was?

Der In-Memory-Teil ist mir unklar, was bedeutet das?

Wenn das bedeutet, dass Sie den Speicher des Computers verwenden können, funktioniert es nicht schon so?

+0

Wo haben Sie das gelesen? Es ist irreführend, weil ein Datei-Handle * immer * eine speicherinterne Struktur ist. Dies bezieht sich höchstwahrscheinlich auf das direkte Öffnen von Dateihandles auf Perl-Skalarvariablen (die sich im Speicher befinden). – Borodin

+0

Ja, Ihr Kommentar ist korrekt, das ist was ich meinte – airnet

+1

'perldoc -f open' bezeichnet diese als" In-Memory-Dateien " – mob

Antwort

16

Dies bedeutet, dass Sie Dateihandles zum Schreiben und Lesen von Skalarvariablen verwenden können.

my $var = ""; 
open my $fh, '>', \$var; 
print $fh "asdf"; 
close $fh; 
print $var;   # asdf 

Letztendlich ist dies nur eine weitere Möglichkeit

$var .= "asdf" 

zu tun, aber es gibt Kontexte, in denen bequemen oder besser geeignet ist als Dateihandle Paradigmen String-Manipulation Paradigmen zu verwenden.

Zum Beispiel mit diesem Code starten:

open my $fh, '>', $logfile; 
... 
print $fh $some_message_to_be_logged; 
... 500 more print $fh statements ... 
close $fh; 

Aber wissen Sie was? Jetzt würde ich lieber meine Log-Meldungen in einer Skalarvariable aufnehmen, vielleicht so kann ich durch sie suchen, sie manipulieren, bevor sie auf die Festplatte geschrieben werden, usw. Ich meine alles ändern könnte print Aussagen zu

$logvar .= $some_message_to_be_logged 

aber in In diesem Fall ist es bequemer, nur die open Anweisung zu ändern.

open my $fh, '>', \$logvar 
0

Sie können Dateihandles direkt in skalare Variablen öffnen. Es ist besonders nützlich, wenn Sie etwas haben, das sich wie eine Datei verhalten muss, aber Sie wollen nicht eine auf der Festplatte. Dieses Beispiel ist aus perldoc genommen:

close STDOUT; 
open(STDOUT, ">", \$variable) 
or die "Can't open STDOUT: $!"; 

Es schließt STDOUT und dann wieder öffnet es $variable angebracht.