жемчуг: символы экспорта от модуля, который имеет> 1 пакет

Быстрый поиск Google придумал этот http://en.wikipedia.org/wiki/Delegation_pattern . В основном в любое время то, что Вы используете объект, что вперед это - вызовы к другому объекту тогда, Вы делегируете.

7
задан Flimzy 20 July 2012 в 18:16
поделиться

4 ответа

At the end of the module, put:

BEGIN { $INC{'foo/wizzy.pm'} = 1 }

Then code can just say:

use foo::bar;
use foo::wizzy;

to get foo::wizzy's exports.

3
ответ дан 6 December 2019 в 10:01
поделиться

Во-первых, я считаю полезным использовать закрывающие фигурные скобки для управления областью действия при заполнении нескольких пакетов в один файл. Кроме того, включение пакета в блок BEGIN делает его более похожим на правильное использование , которое использовалось для его загрузки, но в основном это происходит, если я втиснул пакет в основной сценарий.

use Foo совпадает с BEGIN {требуется Foo; Foo-> import} .

Итак, у вас есть два варианта:

  • call BEGIN {Foo :: Whizzy-> import; } в вашем основном скрипте.
  • make Foo :: Bar :: import trigger Foo :: Whizzy :: import в вызывающем модуле.

В Foo /Bar.pm:[1227 visible) В вашем основном коде:

use Foo::Bar;

# If you don't do a custom import for Foo::Bar, add this line:
BEGIN { Foo::Whizzy->import };
2
ответ дан 6 December 2019 в 10:01
поделиться

Когда вы вызываете , используйте foo :: bar , на самом деле происходит следующее:

BEGIN {
    require foo::bar;
    foo::bar->import;
}

(см. perldoc -f use )

Так что import никогда не вызывается на foo :: wizzy . Если вы хотите импортировать и эти символы, вы можете сами вызвать BEGIN {foo :: wizzy-> import} (после используйте foo :: bar ). Или, как вы сказали, просто разделите эти два пакета на отдельные файлы, которые будут намного более удобочитаемы.

(Кстати, не рекомендуется использовать имена пакетов в нижнем регистре, поскольку они обычно зарезервированы для perl pragmata.)

7
ответ дан 6 December 2019 в 10:01
поделиться

Вы можете сделать это с помощью метода Exporter export_to_level , чтобы «основной пакет» повторно экспортировал символы «другого» пакета следующим образом:

sub import {
   my $self = shift;
   $self->export_to_level(1, @_);
   Some::Other::Module->export_to_level(1);
}

, хотя если ] Some :: Other :: Module делает что-то более сложное, чем «экспорт всего», вам, вероятно, понадобится более изящная обработка для @_ .

Мне действительно нужно спросить , почему ], хотя - я не могу себе представить, как это можно использовать, совместимое со словами «хороший код» :)

7
ответ дан 6 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: