Если у вас имеется много подпрограмм, особенно подпрограмм, которые вы храните в различных файлах, то может возникнуть коллизия имен переменных, когда одно и то же имя переменной используется в различных целях. Perl помогает избежать этого с помощью пакетов ( packages ). Как известно, объявляя локальные переменные для подпрограмм, можно избежать коллизии имен. Однако если несколько подпрограмм совместно используют какие-то специфические данные, то эти данные могут потребовать глобальной области видимости, что как раз и может вести к коллизии имен. Используя пакеты, можно группировать глобальные данные в частные пространства имен ( name - spaces ), вне пределов которых глобальные переменные не видны, т. е. неизвестны. Рассмотрим приведенный ниже простой пример, в котором две подпрограммы (находящиеся в различных файлах) используют частные, индивидуальные пространства имен.
# Код в файле one . pl
sub sub_one
{
package demo_one;
$some_data = 10;
}
# * * * * * * * *
# Код в файле two.pl
sub sub_one
{
package demo_two;
$ some _ data = 20;
}
Как можно видеть, первая подпрограмма использует имя пакета demo _ one , вторая подпрограмма использует имя пакета demo _ two . Обе подпрограммы могут устанавливать и использовать переменную $ some _ data без возникновения коллизии имен между одной и другой глобальными переменными.
Скрипт «знает» имя пакета, в пределах которого находится переменная, и он организует доступ к ней, использует имя пакета в качестве префикса к имени переменной. В следующем примере имя пакета package _ one или package _ two добавляется в качестве префикса к имени переменной some _ data :
&sub_one;
&sub_two;
print “ Переменная 1 $package_one’some_data\n”
print “ Переменная 2 $package_two’some_data\n”
Когда вы используете пакеты языка Perl , можете создать уникальное пространство имен в пределах текущего файла исходных кодов путем помещения инструкции package в начале файла, как показано ниже:
package some_package_name
$some_data = 1;
sub some_sub
{
return $some_data;
}
В данном случае переменная $ some _ data существует только в пакете и поэтому защищена от некорректного доступа. Использование пакета, таким образом, обеспечивает данным ту же область видимости, что и в языке программирования С, где глобальные переменные имеют своей областью видимости тот файл исходных кодов, в котором они объявлены. При вызове подпрограммы из другого файла скриптов необходимо использовать имя пакета:
require ‘some_package.pl’;
print &some_package_name’some_sub;