1

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

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:

感谢和问候,

4

1 回答 1

4

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

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

  • 列出模块中s的&子程序时可以没有;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 feature qw(say);

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

use FFTG::PID qw(:default);

say func1(10,20);

它用 打印一行30

于 2017-05-18T07:42:37.943 回答