Относительно времени компиляции и времени выполнения:
В Perl модули (пакеты / пространства имен) обычно находятся в отдельных файлах. То есть Some::Module
будет найдено в Some / Module.pm. В этой настройке разница compile-vs-run-time не будет иметь большого значения. Время выполнения модуля, загружаемого вами через use()
, будет до того, как продолжится время компиляции вызывающего кода. Наблюдатель:
Файл Some/Module.pm
:
package Some::Module;
BEGIN{ print "Some::Module - compile time\n" }
print "Some::Module - run time\n";
1;
Файл test.pl
:
BEGIN{ print "Just started compiling the program.\n" }
use Some::Module;
BEGIN{ print "main - compile time\n" }
print "main - run time\n";
Вывод будет:
Just started compiling the program.
Some::Module - compile time
Some::Module - run time
main - compile time
main - run time
Следовательно, our @ISA = qw(Base);
будет выполняться до того, как компиляция вашей основной программы продолжится после загрузки модуля.
Однако правильно, что присвоение @ISA
не гарантирует, что базовый класс был загружен. Вот почему у нас есть use base
и use parent
прагмы. Если вам конкретно не нужны какие-либо функции use base
(поля) и не требуется более длительная обратная совместимость, которую она обеспечивает для use parent
, я предлагаю вам использовать более легкую use parent
.