НАЗВАНИЕ
perlmod - модули Perl (пакеты и таблицы симолов)
ОПИСАНИЕ
Is this the document you were after?
Существуют другие документы, которые могут содержать нужную вам иинформацию: There are other documents which might contain the information that you're looking for:
- В этом документе
-
Пакеты, пространства имен и некоторая информация о классах в Perl.
- perlnewmod
-
Руководство по созданию современных модулей.
- perlmodstyle
-
Лучшие практики по созданию современных модулей.
Пакеты
Perl предоставляет механизм изменения пространства имен для защиты пакетов от засорения друг друга всеми своими переменными. Фактически, в Perl нет такой вещи, как глобальные переменные. Инструкция package объявляет единицу компиляции, находящуюся в данном пространстве имен. Область действия объявления пакета начинается от самого объявления и простирается дол конца окружающего блока, eval
или файла, взависимости от того, что будет первым (такую же область имеют операторы my() и local()). Неквалифицированные динамические идентификаторы будут находится в этом пространстве имен, за исключением тех немногих идентификаторов, которые, будучи неквалифицированными, по умолчанию находятся в пакете main, как будет описано ниже. Инструкция package затрагивает только на динамические переменные--включая те, к которым применили local()--но не на лексические переменные, создаваемые при помощи my(). Обычно package будет первым объявлением в файле, который вы подключаете используя операторы do
, require
или use
. Вы можете перключится в пакет в различных местах; это переключение влият только на то, какая таблица сиволов будет использоваться компилятором до конца этого блока. На переменные и файловые указатели в пакете можно ссылаться из других пакетов, предваряя имя переменной именем пакета и двойным двоеточием: Package::Variable
. Если имя пакета отсутствует, подразумевается пакет main. То есть $::sail
эквивалентно $main::seil
.
В старину разделителем пакета служила одинарная кавычка, но сейчас предпочтительно использовать двойное двоеточие, оно более человекочитаемо, и также лучше читается в макросах emacs. Также два двоеточия позволяют С++ программистам чувствовать, что они понимают, что происходит--в отличии от разделителя одинарная кавычка, позволявшей испытывать похожее чувство Ada программистам. Поскольку старомодный синтаксис все еще поддерживается для обеспечения обратной совместимости, если вы попытаетесь использовать подобную строку "This is $owner's house"
, вы обратитесь к $owner::s
; то есть, к переменной $s в пакете owner
, что вероятно не то, что вы хотели. Используйте фигурные скобки для устранения неоднозначности, как здесь "This is ${owner}'s house"
.
Пакеты сами могут содержать разделители пакетов, например $OUTER::INNER::var
. Однако это ничего не подразумевает о порядке поиска имен. Нет относительных пакетов: все символы либо локальны в текущем пакете, либо должны быть полностью квалифицированы от внешнего пакета. Например, в пакете OUTER
ничто не позволит $INNER::var
относиться к $OUTER::INNER::var
. INNER
относится к полностью отдельному глоьбальному пакету.
В таблице символов пакета хранятся только идентификаторы, начинающиеся с буквы или знака подчеркивания. Все другие символы, включая пунктуационные переменные подобно $_, хранятся в пакете main
. В добавок, идентификаторы STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC и SIG, если они не квалифицированы, принудительно помещаются в main
, даже когда они используются для других целей, нежели предназначены изначально. Если вы назовете свои пакеты m
, s
или y
, вы не сможете использовать квалифицированую форму идентификатора, поскольку она будет интерпретирована как поиск по шаблону, замена или транслитерация, соответственно.
Переменные, начинающиеся с нижнего подчеркивания, ранее использовались для принудительного помещения в пакет main, но мы решили, что они более полезны разработчикам пакетов для индикации имен приватных переменных и методов. Однако, имена переменных и функций, состоящие из едиственного _
, такие как $_
или sub _
, по прежнему принудительно находятся в пакете main
. Смотрите также "The Syntax of Variable Names" in perlvar.
Обрабатываемые eval
-м строки компилируются в том же пакете, в котором компилируется eval(). (Однако, при присваивании $SIG{}
полагается, что обработчик сигнала определен в пакете main
. Квалифицируйте имя обработчика сигнала, если хотите использовать обработчик сигнала из пакета.) Для примера взгляните на perldb.pl из библиотеки Perl. В начале работы он переключается на пакет DB
, что бы отладчик не мешал работать с переменными в отлаживаемой программе.