Создание и использование модуля 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;

  • Там может быть нет & при перечислении подпрограмм для EXPORTs в модуле; это должны быть имена и & не является частью имени. От использования прагмы (мой акцент)

    Импортирует некоторую семантику в текущий пакет из названного модуля

  • Названия заглавных букв - рискованная идея, поскольку они могут быть взяты, и 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,

Другие вопросы по тегам