2015-06-23 2 views
0

У меня есть файл perl, который использует два perl-модуля A.pm, B.pm.Как вызвать подпрограмму из одного модуля perl в другой модуль perl?

Но в B.pm Мне нужно вызвать подпрограмму A.pm. Даже если я использую в A.pm и пытаюсь его использовать, я все равно получаю неопределенную ошибку.

Любая помощь по этому поводу очень ценится.

+0

Я думаю, вам нужно сказать «использовать A» в начале файла B.pm, а затем вызвать sub с A :: your_sub_name(); –

+5

Опубликуйте полный пример, демонстрирующий проблему. –

+0

Трудно сказать, что вы сделали неправильно, так как вы не показали нам, но это, возможно, дубликат [Почему функции из пакета A не импортируются в пакет B, когда они рекурсивно называют друг друга?] (Http: // stackoverflow .com/q/11521584/589924) – ikegami

ответ

2

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

print join ("\n", @INC); 

Это места, где это выглядит. Он также проверит текущий рабочий каталог, но это немного сложнее, используя относительный путь времени выполнения - для этого вам необходимо использовать модуль FindBin.

Второй элемент - импорт и экспорт подпрограммы. По умолчанию, если вы use A; вы не будет импортировать все в свое местное пространство имен, потому что ... вы не хотите случайно переопределять одну из своих внутренних функций. Таким образом, безумие.

Так что вы либо:

use A qw (somefunction); 

Какой будет «тянуть» эту функцию и определить его в локальном пространстве имен. Точное поведение этих вещей можно изменить с помощью Exporter и установить @EXPORT и @EXPORT_OK.

Или обратитесь к нему по «пути пакета».

A::somefunction(@arguments); 

Это также работает для переменных, хотя вы должны рамки их our, а не my.

+0

Спасибо, что это решение сработало. – googytech

0

Неопределенная ошибка может быть из-за того, что ваш B.PM не может найти A.PM. Вы можете попробовать использовать

use FindBin; 
use lib "$FindBin::Bin/../lib"; 

или непосредственно с помощью use lib "$folder containing A.pm"

Кроме того, я не ясно, где вы получаете не определено. В вашем скрипте perl или в вашем модуле B.PM?

+0

Нет, это приведет к 'Невозможно найти A.pm в @ INC' – ikegami