В Perl ключевое слово use
в точности соответствует следующему:
use Mymodule;
#is the same as
BEGIN {
require Mymodule;
Mymodule->import();
}
Так что, если вы не определяете подпрограмму импорта в своем коде (или наследуете от Exporter
), тогда вашмодули ничего не импортируют в test.pl
Как поймал Синан, вы не объявляете пакет в своих модулях, поэтому они по умолчанию устанавливаются на пакет main
.В этом случае все ваши подпрограммы находятся в main
, но лексические переменные (объявленные с my
) ограничиваются только тем файлом, в котором они объявлены.
Так что m1
определяет sub init
и sub printab
, к которым относятся лексики $a
и $b
.Но затем, когда test.pl
загружает m2
, подпрограмма init
перезаписывается новым определением, которое больше не закрывается вокруг двух лексических выражений.Поэтому он записывает в переменные пакета $main::a
и $main::b
вместо лексических выражений, с которыми связан printab
.
Если бы у вас были включены предупреждения (что вы всегда должны были делать при изучении), вы быВы были предупреждены о переопределении подпрограммы.
Вы должны запустить каждый из ваших модулей с:
package Some::Package::Name;
use warnings;
use strict;
, а затем завершить каждый модуль с:
1;
Это потому, чтокогда вы use/require
модуль, он должен вернуть истинное значение в конце, чтобы Perl знал, что он загружен правильно.