Создание и использование модуля Perl - неопределенная подпрограмма
Я пытаюсь создать и использовать модули в новом скрипте, который я делаю, но я еще не знаком с модулями. Я следовал некоторым учебникам, и даже если у меня "почти" тот же код, что и в учебнике, он не работает, и когда я запускаю свой тестовый скрипт, я получаю следующую ошибку:
Undefined subroutine &main::func1 called at ../../bin/fftg.pl line 21.
Вот мой основной сценарий:
#!/usr/bin/perl
# ......
# comments here
# ......
use strict;
use warnings;
use File::Basename qw(dirname);
use Cwd qw(abs_path);
use lib dirname(dirname abs_path $0) . '/lib';
use FFTG::PID qw(:DEFAULT);
print func1(10,20);
и вот модуль, созданный в виде файла lib / FFTG / PID.pm:
package PID;
use strict;
use warnings;
use Exporter;
our $VERSION = 1.00;
our @ISA = qw(Exporter);
our @EXPORT = qw(&func1 &func2); # I tried all lines without &
our @EXPORT_OK = qw(&func1 &func2); # I tried all lines without &
our %EXPORT_TAGS = ( DEFAULT => [qw(&func1)],
Both => [qw(&func1 &func2)]);
sub func1
{
my ($x, $y) = @_;
return $x + $y;
}
sub func2
{
return "tata\n";
}
1;
что я делаю не так, пожалуйста? Я попытался загрузить вещь, используя:
use FFTG::PID qw(:DEFAULT);
use FFTG::PID;
use FFTG::PID qw(funct1);
use FFTG::PID qw(&funct1);
ничего не работает (та же ошибка)
Я также попытался изменить модуль, изменив эти строки, удалив или добавив &:
our @EXPORT = qw(func1 func2);
our @EXPORT_OK = qw(func1 func2);
та же проблема
какие-нибудь намеки?
мои папки и файлы:
MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2: pwd
/wminfs/mc/projects/FFTGv2
MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2: ls -al bin/fftg.pl
-rwxr-x--- 1 root root 545 May 18 09:49 bin/fftg.pl
MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2: ls -al lib/FFTG/PID.pm
-rw-r----- 1 root root 344 May 18 09:37 lib/FFTG/PID.pm
MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2:
С уважением,
1 ответ
Есть несколько ошибок и несколько вещей, которые можно сделать лучше.
Имя модуля должно соответствовать его (относительному) расположению, поэтому:
package FFTG::PID;
Там может быть нет
&
при перечислении подпрограмм дляEXPORT
s в модуле; это должны быть имена и&
не является частью имени. От использования прагмы (мой акцент)Импортирует некоторую семантику в текущий пакет из названного модуля
Названия заглавных букв - рискованная идея, поскольку они могут быть взяты, и
DEFAULT
не может быть использован здесь
Как правило, это хороший совет для использования @EXPORT_OK
, и не @EXPORT
,
Наконец, строка, которая устанавливает lib, вызывает проблемы. Используйте FindBin.
Пакет lib/FFTG/PID.pm
package FFTG::PID;
use strict;
use warnings;
use Exporter qw(import);
our $VERSION = 1.00;
our @EXPORT_OK = qw(func1 func2);
our %EXPORT_TAGS = (
default => [ qw(func1) ],
both => [ qw(func1 func2) ]
);
sub func1
{
my ($x, $y) = @_;
return $x + $y;
}
sub func2
{
return "tata\n";
}
1;
где я также заменил явную настройку @ISA
с экспортеромimport
метод.
Основная программа
use strict;
use warnings;
use FindBin qw($RealBin);
use lib "$RealBin/lib";
use FFTG::PID qw(:default);
print func1(10,20), "\n";
Печатает строку с 30
,