Сначала загрузите пакет:
require A::B;
Затем псевдоним B
до A::B
:
*B:: = *A::B::;
Затем скажите require
, что он уже загружен B
$INC{'B.pm'}++;
Чтобы убедиться, что все работает правильно, лучше всего выполнить следующие действия внутри блока BEGIN
:
BEGIN {
require A::B;
*B:: = *A::B::;
$INC{'B.pm'}++;
}
После этого все require A::B;
и require B;
линии станут неактивными.Вы также сможете ссылаться на переменные в этом пакете с любым именем.\&A::B::foo == \&B::foo
Чтобы это работало прозрачно, вы можете добавить следующий код в каждый файл:
Тогда, если пользователь делает require A::B;
, он может позвонить A::B::foo
или B::foo
и require B;
станет нет-оп.
И если пользователь делает require B;
, он может позвонить A::B::foo
или B::foo
и require A::B;
станет неактивным.
Но для удобства обслуживания этовероятно, лучше всего хранить весь реальный код в одном файле (вместе с кодом псевдонимов, приведенным выше), и настроить другой файл как шим, который просто загружает реальный файл.Предполагая, что A/B.pm
содержит реальный код: