2012-04-13 4 views
4

Прочитав о прагме перегрузка из Perl5, я заметил оператора *{}.'* {}' кажется действительным оператором разыменования Perl5 (perldoc: перегрузка). Что это значит?

Я хотел бы знать, что такое sigil *, если таковой имеется, или в чем смысл * в контексте контекста.

+1

См. Также: http://stackoverflow.com/questions/4865447/demystifying-the-perl-glob –

ответ

3

*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.

+0

@mgodinho, обновлено. – ikegami

4

Это относится к typeglob. Он может ссылаться на любой тип. Сейчас они в основном наследие.

+1

Не устаревшее. 'IO :: Socket' и его подклассы используют typeglobs для хранения конфигурации каждого sockethandle. – mob

+0

«Типglob» (или «glob» для краткости) - это имя Perl для «записи в таблице символов». В таблице символов хранятся все символы, относящиеся к пакету, и все «действительно глобальные» переменные (например, '$ 1'). Без символа не было бы именованных подпрограмм, '@ ISA' и' @ EXPORT' не существовало бы, и не было бы '$ _',' @ _', '$$' и т. Д. Globs определенно * нет * наследство. Глобусы также используются для обертывания объектов IO (файловых дескрипторов), включая лексические дескрипторы файлов, хотя это может быть связано с устаревшими причинами, так как объекты IO теперь являются первоклассными объектами. – ikegami

+0

@mob, Хотя globs не являются устаревшими, ваш комментарий не является допустимым аргументом против globs, являющегося наследством. Они только рассуждают, что IO :: Socket использует globs, потому что объекты IO завернуты в них, и поскольку это может быть по наследству, IO :: Socket может делать это по причинам, связанным с наследством. – ikegami

Смежные вопросы