*foo
- это «типglob», или «glob» для краткости. Глобус представляет собой структуру (как в C struct
) с полями ARRAY
, HASH
, IO
и т. Д. Эти поля не содержат ничего или ссылки. С точки зрения кода Perl они выглядят как очень специальные хэши.
Основная цель globs - сервер в качестве записей для таблицы символов Perl. В таблице символов хранятся все символы, относящиеся к пакету, и все «действительно глобальные» переменные (например, STDOUT
, $1
и т. Д.). Без символа, было бы не назвали подпрограммы, @ISA
и @EXPORT
не существовали бы, и ни один бы @_
, $$
и т.д. [Очевидно, что шарики не являются наиболее определенно не наследством.]
$ perl -E'
our @foo = qw(a b c);
our %foo = (d=>4, e=>5);
say @{ *foo{ARRAY} };
say %{ *foo{HASH} };
'
abc
d4e5
также используется Globs как обертки вокруг объектов IO (файлы). Даже open(my $fh, ...)
населяет $fh
с глобусом.
Глобы очень редко используются явно в Perl. Единственным исключением являются файлы старого стиля. Например, FILE
и STDOUT
фактически означает *FILE
и *STDOUT
(при использовании в качестве ручек файлов), которые в срок используются для получения *FILE{IO}
и *STDOUT{IO}
.
$ 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
Так почему же вы хотите, чтобы переопределить *{}
?
Вы бы хотели переопределить *{}
, если хотите создать объект, который выглядит как дескриптор файла, фактически не являясь дескриптором файла. Например, вы можете использовать это переопределение для создания объектов на основе хеша объектов IO :: Socket вместо объектов на основе glob.
См. Также: http://stackoverflow.com/questions/4865447/demystifying-the-perl-glob –