# ... другие подпрограммы библиотеки...
1; # вернуть истинное значение для require
__DATA__ # конец библиотечного файла
Команда require также регистрирует загруженные программы в специальном хэше %INC, поэтому не загружает их повторно. Однако использование библиотек и прочих внешних файлов в таком виде рано или поздно приводит к проблеме совпадения имен глобальных переменных и подпрограмм. Разные библиотеки, созданные разными программистами, неизбежно будут содержать одинаковые идентификаторы. Конфликт между совпадающими именами в разных программных файлах можно разрешить с помощью механизма пакетов.
Пакеты используются в Perl для разделения глобального пространства имен на задаваемые программистом подпространства. Отдельные пространства имен позволяют использовать в каждом из них собственный набор идентификаторов, не конфликтующих с одноименными идентификаторами в других пространствах. Пакет объявляется с помощью команды package, за которой указывается имя пакета. Имена пакетов, задаваемые программистом, принято начинать с заглавной буквы, в отличие от системных, которые записываются строчными буквами. Например:
package Package; # объявить пакет с именем Package
Подпрограммы и глобальные переменные, определенные после команды package, относятся к объявленному пакету. Действие команды package распространяется до конца текущего блока, файла, блока eval или до следующей команды package, начинающей или продолжающей указанный в ней пакет. Каждое употребление команды package означает переключение на соответствующее пространство имен, идентификаторы которого хранятся в собственной таблице имен. Специальная лексема __PACKAGE__ содержит имя текущего пакета. Поясним сказанное таким примером:
package Package; # начало пакета Package
$variable = 'переменная'; # скаляр из пакета Package
sub subroutine { # подпрограмма из пакета Package
return "$variable";
}
package Another; # начало пакета Another
$variable = 'переменная'; # скаляр из пакета Another
sub subroutine { # подпрограмма из пакета Another
return "$variable";
}
package Package; # продолжение пакета Package
@array = (1..5); # массив из пакета Package
В любом пакете можно обратиться к переменной или подпрограмме из другого пакета, указав ее полное имя. Полное имя (или квалифицированное имя) каждого нединамического программного объекта в Perl состоит из имени пакета и идентификатора. Символы :: разделяют эти две части таким образом:
$Package::variable - скалярная переменная из пакета Package
$Another::variable - скалярная переменная из пакета Another
&Package::subroutine - подпрограмма из пакета Package
Package::subroutine - префикс подпрограммы можно не писать
Если глобальные имена не описаны явно в составе какого-либо пакета, то по умолчанию они относятся к пакету main. Можно считать, что объявление этого пакета неявно присутствует в начале любой Perl-программы. Поэтому упоминавшиеся до сих пор глобальные переменные, в том числе большинство специальных, на самом деле относятся к этому пакету. Имя пакета main обычно не указывается, но при необходимости принадлежность к нему можно указать явно:
%pseudo_name = ('Marylin Monroe' => 'Norma Jean');
print $main::pseudo_name{'Marylin Monroe'};
Следующие варианты записи имени обозначают одну и ту же переменную из пакета по умолчанию:
@main::array # с явным именем пакета main
@::array # с пустым именем пакета
@array # без имени пакета
Имена пакетов не применяются к лексическим переменным, объявленным с помощью функций my() и our() и существующим в собственном пространстве имен. Причем область действия переменных, определенных с помощью my(), не может распространяться за пределы исходного файла, а переменные, определенные с помощью our(), видны в пределах пакета, даже если части пакета определены в разных программных файлах. Вот пример сосуществования одноименных переменных из лексической области видимости и пространства имен пакета: