*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.
Siehe auch: http://stackoverflow.com/questions/4865447/demystifying-the-perl-glob –