我正在努力创造&在我正在做的新脚本中使用模块,但我还不熟悉模块。 我一直在关注一些教程,即使我有与教程中“几乎”完全相同的代码,它也不起作用,当我运行我的测试脚本时,我收到以下错误:
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:
感谢 的问候,
答案 0 :(得分:4)
有一些错误,以及一些可以做得更好的事情。
模块名称需要与其(相对)位置匹配,因此:package FFTG::PID;
列出模块中&
的子例程时,不能有EXPORT
;那些应该是名称而&
不是名称的一部分。来自use pragma(我的重点)
从命名模块
将一些语义导入当前包中
全部大写名称是一个冒险的想法,因为它们可能被采用,DEFAULT
不能在这里使用
使用@EXPORT_OK
而不是@EXPORT
通常是个好建议。
包 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
。