Почему я не могу вызвать мою экспортированную подпрограмму в моей программе Perl? - PullRequest
3 голосов
/ 15 сентября 2010

Я новичок в Perl и столкнулся со следующей проблемой, не зная, почему не работает следующее.

Мой модуль Perl содержит:

package PACK2;
use Exporter;
@ISA = ('Exporter');
@EXPORT_OK=('whom');

sub why(){
    print "why\n";
}

sub whom(){
      print "whom\n";
}
1;

Мой файл Perl содержит:

#!/usr/bin/perl -w

use pack;
use pack2 ('whom');

PACK::who();
&whom();

Я запускаю эту программу и не могу найти whom:

perl use_pack_pm.pl

who
Undefined subroutine &main::whom called at use_pack_pm.pl line 7.

Ответы [ 3 ]

8 голосов
/ 15 сентября 2010

Perl является регистрозависимым языком.Я не думаю, что модули "pack2" и "PACK2" одинаковы.(Но я на самом деле не проверял это.)

5 голосов
/ 15 сентября 2010

Внутренне use pack2 ('whom'); переводится в нечто вроде

BEGIN {
    require pack2;
    pack2->import('whom');
}

За исключением того, что perl проверит, может ли он вызвать import на pack2, прежде чем попытаться вызвать его.В вашем примере нет пакета с именем pack2, поэтому нет функции import для вызова.Если имя вашего пакета и имя файла совпадают, тогда Perl найдет функцию import, предоставленную Exporter.

. Нет предупреждения об этом, потому что Perl трудно сказать, когда это было сделано намеренно.Большинство модулей OO не экспортируют никакие функции или переменные и поэтому не имеют функции import.

0 голосов
/ 02 февраля 2016

Получена та же ошибка при использовании модуля из дерева подпапок без объявления полного пути в пакете.

Вы должны написать инструкцию пакета с указанием пути.Для модуля, расположенного в подкаталоге Dir, пишите package Dir::Module;, а не package Module ;.Тогда это работает.

...