У меня есть модуль Perl для проекта. У меня есть, возможно, дюжина программ, зависающих от него, и многое из него является мусором. Я не провел много близкого персонального времени с DBI прежде, так, чтобы часть была закрепляемой, но большая вещь состоит в том, что это является большим. Буквально 2KLOCs.
Было бы легко разбить эту функцию (давайте назовем это Dumb.pm) в отдельные модули (Немой:: FormTools, Немой:: База данных, и т.д.) кроме, как я сказал, существует много программ, которые уже 'используют Немой';
Я хотел бы экспортировать Немой:: экспортные функции Базы данных через Немой, не имея необходимость иметь изменения этого много раз:
sub my_dumb_function { return Dumb::Database::my_dumb_function( @_ ) ; }
Не случается так, что я выше этого. Это просто, что это походит на немой и неэлегантный способ обработать проблему. Я использовал, "Не знают не лучше" оправдание однажды, и однажды действительно больше, чем Вы добираетесь.Помощь?
Не уверены, как вы используете его в настоящее время (в настоящее время он экспортирует методы экспорта?), Но вы можете настроить новые детские модули, чтобы позволить вам импортировать свои функции (с использованием экспортера), а затем просто иметь оригинальный модуль явно импорт Теперь сломанные части. Что-то вроде:
package Dumb;
use Dumb::Database qw(my_dumb_function);
1;
package Dumb::Database;
use base qw(Exporter);
our @EXPORT_OK = qw(my_dumb_function);
sub my_dumb_function { 1; }
1;
Сложно дать конкретный совет, так как разные базы кода требуют разных стратегий. Я рефакторизирую модуль с 500-строчными подпрограммами иначе, чем модуль с маленькими подпрограммами и большим количеством повторяющегося кода. Если мне нужно изменить и интерфейс, то для этого есть разные стратегии.
Я думаю, что ваш актуальный вопрос - "Как экспортировать в оригинальный модуль, который загрузил Dumb?". Вы можете предоставить свою собственную процедуру импорта
, которая использует метод Exporter's import_to_level
. Вы можете импортировать в более высокие уровни, чем тот, который был загружен сразу же. Таким образом, Dumb::Database
import
может загружать свои экспортированные данные в пространство имен, которое загрузило Dumb
, несмотря на то, что именно Dumb
загружает Dumb::Database
.
Я предполагаю, что DUBLE.PM в настоящее время использует экспортер. Предполагая, что вы не хотите переименовать функции (просто разделите их на отдельные модули), вы должны быть в состоянии сохранить существующие @Export
определения, импортируйте все из ваших подмодулей и просто повторно экспортируют Функции.
package Dumb;
use Dumb::FormTools ':all';
use Dumb::Database ':all';
use Exporter 'import';
our @EXPORT = ...; # Unchanged from original version
our @EXPORT_OK = ...; # Unchanged from original version
1;
: все
тег не определяется по умолчанию. Вы должны определить его вручную (в каждом подмодуле).
our %EXPORT_TAGS = ( all => [ @EXPORT, @EXPORT_OK ] );
# or, for a module that doesn't export anything by default:
our %EXPORT_TAGS = ( all => \@EXPORT_OK );
С другой стороны, если подмодуль нет @Export_ok
Функции, то вы можете пропустить тег : все
и просто сказать , используйте тупого :: подмодуль;
.