Многие пользователи не понимают в Perl namespace .
Без обработки пространства имен что-то вроде CPAN архива модулей Perl было бы невозможно, потому что каждый модуль должен был бы убедиться, что никакие другие модули не имеют подпрограмм и имен переменных, которые есть у любого другого модуля.has.
Стандартным способом написания Perl каждый модуль Perl имеет свое собственное пространство имен.Таким образом, имена и функции переменных не вступают в противоречие с переменными и функциями, которые вы определили в своей программе.
Посмотрите на свой тестовый модуль и посмотрите, есть ли строка:
package Test;
в верхней части программы.Если это так, это означает, что каждая переменная в вашем модуле и каждая подпрограмма находятся в пространстве имен Test
, а не в вашем пространстве main
(которое является пространством имен по умолчанию).Команда package изменяет пространство имен до следующей команды пакета.
Если (как мы подозреваем) ваш модуль Test.pm имеет команду package
, вам нужно обратитьсяк вашей подпрограмме spGetCurDateTime
как Test::spGetCurDateTime
.
Как уже указывалось, вы можете импортировать переменных и имен функций в текущее пространство имен, используя Exporter .
package Test;
use base qw(Exporter);
our @EXPORT qw(spGetCurDateTime log);
sub spGetCurDateTime {
};
В вашей основной программе:
use Test;
автоматически импортирует подпрограммы spGetCurDateTime и log , и вы можете просто использовать их как spGetCurDateTime()
иlog instead of
Test :: spGetCurDateTime and
Test :: log`.
Однако импорт всех подпрограмм и переменных по умолчанию теперь не рекомендуется, поскольку он может без предупреждения создавать помехи для собственной программы пользователя.В приведенном выше примере я не только импортирую функцию log
, но и переопределяю функцию log
, встроенную в Perl (log
принимает натуральный логарифм числа).
Лучше использовать EXPORT_OK
и позволить пользователям выбирать функции, которые они хотят импортировать:
package Test;
use base qw(Exporter);
our @EXPORT_OK qw(spGetCurDateTime log);
sub spGetCurDateTime {
};
В вашей основной программе:
use Test qw(spGetCurDateTime);
Теперь вы можете сделать spGetCurDateTime()
вместо Test::spGetCurDateTime
, но вы не изменили log
, даже не осознав этого.Вы все еще можете сказать Test::log
, чтобы выполнить подпрограмму log
в вашем модуле.