2014-02-10 1 views
0

Я запутался с линиямиPerl: когда использовать Экспорт в модули?

use Exporter; 
our @EXPORT =qw(a b); 

в упаковке.

Я видел пакеты, не используя @EXPORT, и работаю просто отлично. Довольно смутно ... Я искал googled, но не нашел много объяснений.

Мой вопрос в том, когда вы должны использовать @EXPORT? И в чем причина не использовать его?

+0

Если вы хотите экспортировать что-то в пространство имен вашего вызывающего абонента (и когда вы не используете что-то более новое и приятное, например Sub :: Exporter). – hobbs

+0

В вашем примере содержится содержимое @EXPORT с двойным кавычками. Используйте либо qw (a b), либо используйте ('a', 'b'). – harmic

+0

@harmic, да, его модифицировали. – olala

ответ

3

На самом деле есть два вопроса (или, может быть, вы только задаете вопрос, но полный ответ должен ответить на оба вопроса).

Когда мне нужно использовать Exporter

Когда вы используете 'чей-то Perl модуль, два различных действия принимаются. Первый - загрузить их пакет; второй - это вызов «импорт» своего пакета.

Просто загрузите свой пакет в результаты, когда содержимое их пакета определено в пространстве имен своего пакета. Вы можете использовать его сразу, без второго шага, но вам нужно будет обратиться ко всем его подписям и т. Д., Используя полное имя пакета. Например, если их пакет содержал:

package Foo::Bar; 

sub fabronicate { 
    print "This is a nice sub!\n"; 
} 

то, кто хочет использовать, если бы это сделать:

use Foo::Bar; 

Foo::Bar::fabronicate(); 

Все, что набрав Foo :: Bar перед всем будет стареть очень быстро. Решением этого является объявление в пакете «import». Этот субподрядчик должен будет экспортировать публичные субмарины (и переменные и все остальное, что должен предоставить модуль) в пространство имен вызывающего (пакет, который использует «модуль»).

Что делает модуль Exporter, предоставляет вам «импорт». Это означает, что вам не нужно писать какой-то странный код для создания псевдонимов для всех символов, которые должны быть экспортированы, все это сделано для вас.

Учтите, что вам не нужно использовать Экспортер. Вы можете написать свою собственную процедуру импорта, или есть альтернативные модули для обработки символов экспорта.

Или вы можете просто позволить людям, использующим ваш модуль, явно указывать имя пакета все время. Это часто встречается в объектно-ориентированных модулях, потому что это только методы класса (такие как конструкторы), которые должны быть явно префиксными именами пакетов. После того, как у вас есть экземпляр объекта, поиск пакетов выполняется автоматически. Например:

my $o = Foo::Bar->new(); 
$o->fabronicate(); 

Когда мне нужно использовать @EXPORT

Экспортер модуль должен знать, из символов (Subs, переменные и т.д.), которые определены в пакете, какие из них должны быть экспортированы , Обычно будет экспортировано только небольшое подмножество. Он проконсультирует несколько переменных пакета, чтобы узнать об этом: @EXPORT и @EXPORT_OK.

@EXPORT содержит список символов, которые вы хотите экспортировать всем, кто использует ваш модуль, они явно не упоминают список символов для импорта. Первоначально это звучит нормально, пока вы не поймете, что будут проблемы, если ваши модули экспортируют некоторые имена, которые также экспортируются другими модулями.

@EXPORT_OK содержит список символов, которые могут быть экспортированы, если вызывающий модуль специально запрашивает их. Вызывающий модуль определяет их с помощью списка имен после имени модуля в инструкции «use».

use Foo::Bar qw(fabronicate); 

# Now I can call fabronicate directly! 

Обратите внимание, что предоставление списка символов работает так или иначе: большая разница между @EXPORT и @EXPORT_OK это то, что происходит, когда кто-то использует свой модуль, но не предоставляет список, как это:

use Foo::Bar; 

В этом случае все, что указано в @EXPORT, импортируется, и ничего не указано в @EXPORT_OK.

Есть и другие переменные, которые позволяют указывать теги, которые импортируют несколько символов. Документация Exporter - лучшее место для поиска.

+0

спасибо за объяснение! Вопрос, если вы используете @EXPORT, вы также можете указать, какие методы импортировать в вызывающем скрипте, правильно? например, используя Foo :: Bar qw (fabronicate); – olala

+1

@ user2157668 Правильно. Я обновил ответ, чтобы сделать это более ясным. – harmic

Смежные вопросы