Как сказал @ tooli c, use ping_common
должен быть после оператора package
. Вот почему.
Пакеты в Perl изолируют глобальные переменные и функции. Полное название для ping_dbh
действительно ping_mod::ping_dbh
. Вы можете позвонить ping_dbh
в пакете ping_mod
. Если вы хотите вызвать его в другом месте, вы должны использовать его полное имя, ping_mod::ping_dbh
.
use Module
на самом деле require Module
для его загрузки и Module->import
для импорта его функций и переменных в текущий пакет. Неважно, куда загружен модуль, если он загружен. Но очень важно, где он импортируется.
Имея это в виду, посмотрите на это.
use ping_common;
package ping_mod;
Это загрузит ping_common
и импортирует его функции, а не в ping_mod
, но в пакет по умолчанию main
. Они не будут доступны для ping_mod
.
package ping_mod;
use ping_common;
Это также загружает ping_common
, но импортирует его функции в ping_mod
.
Но почему Exporter по-прежнему работает, даже если вне пакета?
use Exporter;
use ping_common;
package ping_mod;
@ISA = qw(Exporter);
@EXPORT = qw(ping_dbh);
Как ни странно, экспортер не работает при экспорте. Работает по наследству. @ISA = qw(Exporter);
заставляет ping_mod
наследовать метод import
от Exporter. То, что @ISA
находится в пакете ping_mod
, является глобальной переменной @ping_mod::ISA
.
.pm, и файлы обычно должны начинаться с оператора package
. Они не должны начинаться с #!
; хотя это ничего не повредит. #!
сообщает операционной системе, что использовать для запуска файла в качестве исполняемой программы. Модули Perl, как правило, не являются исполняемыми.
Подробнее о пакетах вы можете прочитать в perlmod .