импортировать подпрограмму библиотеки при использовании FindBin в Perl - PullRequest
0 голосов
/ 30 августа 2010

EDIT Извините за путаницу, вот мой обновленный вопрос.

Я использую FindBin в моем скрипте Perl, как это:

use FindBin qw($Bin);
use lib "$Bin/../lib";
use multi_lib qw(say_hello_world);

Это работает:

multi_lib::say_hello_world();

но это не так:

say_hello_world();

РЕДАКТИРОВАТЬ 2

Вот так выглядит multi_lib.pm:

package multi_lib;

use strict;
use warnings;
use 5.010;

require Exporter;
my @ISA = qw(Exporter); # removing `my` causes an error!
my @EXPORT_OK = qw(say_hello_world); # removing `my` causes an error!

sub say_hello_world {
 say "hello world!";
}

p.s. Я понятия не имею, что означает @ISA, и если добавление my в порядке ... Я следовал preldoc для Exporter.

Редактировать 3 Я думаю, что решил это, переместив @EXPORT_OK до use strict. Я привык ставить use strict прямо в начале моих сценариев, но я думаю, что это не тот путь, чтобы пойти сюда (?). Во всяком случае, это работает:

use Exporter 'import';
@EXPORT_OK = qw(say_hello_world);
use strict;
...

Я все равно буду благодарен за некоторые пояснения относительно того, что именно здесь происходит и каков рекомендуемый способ экспорта подпрограмм (как я сделал?).

Ответы [ 3 ]

4 голосов
/ 30 августа 2010

Вы не можете этого сделать.Процедура lib () lib изменяет @INC вместо того, чтобы пытаться что-либо экспортировать.Но в любом случае в lib.pm нет функций, подходящих для внешнего использования.Что вы действительно пытаетесь достичь?

Обновленный ответ на обновленный вопрос:

Нет, вы не можете использовать my () для @EXPORT_OK;он должен быть виден глобально, чтобы экспортер мог его использовать.Скажи our @EXPORT_OK; вместо этого.То же самое верно для @ISA;переменная пакета @ISA контролирует наследование, лексическая @ISA ничего не делает.Я предпочитаю не наследовать от Exporter, хотя;Вы делаете это (за исключением очень старого Экспортера), просто импортируя подпрограмму импорта Экспортера:

use Exporter 5.57 'import';

Полученная вами ошибка, которая побудила вас добавить my (), была вызвана тем, что вы указали use strict; (что, помимо прочего, требует, чтобы переменные были должным образом объявлены, если они не являются переменными пакета, квалифицированными по имени пакета или специальным глобальным переменным).our () является эквивалентом my (), который объявляет переменные как переменные пакета, а не как лексические, поэтому они доступны вне области, в которой они объявлены.Лучше правильно объявить их с помощью нашего (), чем просто переместить их выше use strict;, чтобы обойти ошибку.

0 голосов
/ 30 августа 2010

Я хотел бы внести конкретный подпрограмма (он же say_hello_world) из lib, но это не работает:

use lib "$Bin/../lib" qw(say_hello_world);

use lib просто указывает на каталог, в котором находятся файлы, вам также нужно указать файл. Если ваша подпрограмма находится в файле Example.pm, тогда вам нужно

use Example qw(say_hello_world);

Также обратите внимание, что часть FindBin должна находиться внутри блока BEGIN:

BEGIN {
    use FindBin qw($Bin);
    use lib "$Bin/../lib";
};
use Example qw(say_hello_world);
0 голосов
/ 30 августа 2010

Не так работают библиотеки.Вам нужно указать местоположение вашей библиотеки, а затем загрузить из нее модуль (.pm), содержащий нужную подпрограмму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...