Perl 模块创建和使用 - 未定义的子例程

Perl Module Creation & Usage - Undefined subroutine

我正在尝试在我正在执行的新脚本中创建和使用模块,但我还不熟悉模块。 我一直在学习一些教程,即使我有 "almost" 与教程中完全相同的代码,它也不起作用,当我 运行 我的测试脚本时,我收到以下错误:

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 [=11=]) . '/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:

谢谢 问候,

有一些错误,还有一些可以做得更好的地方。

  • 模块名它的(相对)位置,所以:package FFTG::PID;

  • 在模块中列出EXPORT的子程序时不能有&;这些应该是 names& 不是名称的一部分。来自use pragma(我的重点)

    Imports some semantics into the current package from the named module

  • 全大写的名字是一个冒险的想法,因为它们可能会被采用,DEFAULT不能在这里使用

通常建议使用 @EXPORT_OK,而不是 @EXPORT

最后,设置lib is asking for trouble. Use 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;

我还用 Exporterimport 方法替换了 @ISA 的显式设置。

主程序

use strict;
use warnings;
use feature qw(say);

use FindBin qw($RealBin);
use lib "$RealBin/lib";

use FFTG::PID qw(:default);

say func1(10,20);

它打印一行 30