2012-04-13 4 views

Antwort

3

*foo ist ein "typeglob" oder kurz "glob". Ein Glob ist eine Struktur (wie in C struct) mit den Feldern ARRAY, HASH, IO usw. Diese Felder enthalten entweder nichts oder eine Referenz. Aus der Sicht des Perl-Codes sehen sie aus wie ganz spezielle Hashes.

Der primäre Zweck von Globs ist Server als Einträge für Perls Symboltabelle zu dienen. Die Symboltabelle enthält alle Symbole, die zu einem Paket gehören, und alle "wirklich globalen" Variablen (z. B. STDOUT, $1 usw.). Ohne das Symbol, gäbe es keine Namen Subroutinen sein, @ISA und @EXPORT nicht existieren würde, und keiner würde @_, $$ usw. [Offensichtlich Kleckse sind definitiv nicht Erbe.]

$ perl -E' 
    our @foo = qw(a b c); 
    our %foo = (d=>4, e=>5); 
    say @{ *foo{ARRAY} }; 
    say %{ *foo{HASH} }; 
' 
abc 
d4e5 

Klackse auch verwendet werden, als Wrapper um IO-Objekte (Dateihandles). Sogar open(my $fh, ...) füllt $fh mit einem Glob.

Globs werden in Perl sehr selten explizit verwendet. Die einzige Ausnahme sind Dateihandles im alten Stil. Zum Beispiel bedeutet FILE und STDOUT eigentlich *FILE und *STDOUT (wenn sie als Datei-Handles verwendet werden), die verwendet werden, um *FILE{IO} und *STDOUT{IO} zu bekommen.

$ perl -e'open(FILE, "echo foo|") or die; print readline(FILE);' 
foo 

$ perl -e'open(*FILE, "echo foo|") or die; print readline(*FILE);' 
foo 

$ perl -e'open(*FILE{IO}, "echo foo|") or die; print readline(*FILE{IO});' 
foo 

Warum würden Sie wollen *{} außer Kraft zu setzen?

Sie möchten *{} überschreiben, wenn Sie ein Objekt erstellen wollten, das wie ein Datei-Handle aussieht, ohne tatsächlich ein Datei-Handle zu sein. Sie können diese Überschreibung beispielsweise verwenden, um Hash-basierte Objekte des IO :: Socket-Objekts anstelle von globbasierten Objekten zu erstellen.

+0

@mgodinho, aktualisiert. – ikegami

4

Es bezieht sich auf eine typeglob. Es kann sich auf jeden Typ beziehen. Sie sind jetzt größtenteils Erbe.

+1

Nicht veraltet. 'IO :: Socket' und seine Unterklassen verwenden typeglobs, um die Konfiguration für jedes Sockethandle zu speichern. – mob

+0

"Typeglob" (oder kurz "glob") ist Perls Name für einen "Symboltabelleneintrag". Die Symboltabelle enthält alle Symbole, die zu einem Paket gehören, und alle "wirklich globalen" Variablen (z. B. "$ 1"). Ohne das Symbol gäbe es keine benannten Subroutinen, '@ ISA' und' @ EXPORT' wären nicht vorhanden, und auch nicht '$ _',' @ _', '$$' usw. Globs sind definitiv * nicht * Vermächtnis. Globs werden auch zum Umbrechen von IO-Objekten (Dateihandles) einschließlich lexikalischer Dateihandles verwendet, obwohl dies aus Legacy-Gründen sein könnte, da IO-Objekte nun erstklassige Objekte sind. – ikegami

+0

@mob, Während Globs nicht Legacy sind, ist Ihr Kommentar kein gültiges Argument gegen Globs Legacy. Sie begründen nur, dass IO :: Socket Globs verwendet, weil IO-Objekte darin eingeschlossen sind, und da dies aus Legacy-Gründen sein könnte, könnte IO :: Socket dies aus Legacy-Gründen tun. – ikegami