Perl模块创建&用法 - 未定义的子例程

时间:2017-05-18 07:14:55

标签: perl module exporter

我正在努力创造&在我正在做的新脚本中使用模块,但我还不熟悉模块。 我一直在关注一些教程,即使我有与教程中“几乎”完全相同的代码,它也不起作用,当我运行我的测试脚本时,我收到以下错误:

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 个答案:

答案 0 :(得分:4)

有一些错误,以及一些可以做得更好的事情。

  • 模块名称需要与其(相对)位置匹配,因此:package FFTG::PID;

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

      

    从命名模块

    将一些语义导入当前包中
  • 全部大写名称是一个冒险的想法,因为它们可能被采用,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;

我还使用Exporter @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