我尝试使用Exporter
perl模块导出在自定义模块中编写的方法。以下是我的自定义模块ops.pm
use strict;
use warnings;
use Exporter;
package ops;
our @ISA= qw/Exporter/;
our @EXPORT=qw/add/;
our @EXPORT_OK=qw/mutliply/;
sub new
{
my $class=shift;
my $self={};
bless($self,$class);
return $self;
}
sub add
{
my $self=shift;
my $num1=shift;
my $num2=shift;
return $num1+$num2;
}
sub mutliply
{
my $self=shift;
my $num1=shift;
my $num2=shift;
return $num1*$num2;
}
1;
以下是使用ops_export.pl
ops.pm
#!/usr/bin/perl
use strict;
use warnings;
use ops;
my $num=add(1,2);
print "$num\n";
当我执行上述脚本时,我得到以下错误。
Undefined subroutine &main::add called at ops_export.pl line 8.
即使我已使用&main
add
ops.pm
导出了@EXPORT
,我仍无法查看我的脚本正在检查{{1}}包中的原因
我哪里错了?
答案 0 :(得分:3)
ops
是一个pragma already used by Perl。来自文档:
ops - Perl编译指示在编译时限制不安全的操作
我不知道这究竟意味着什么,但这就是问题所在。
将你的模块重命名为其他东西,最好用@simbabque在评论中建议的大写字符,因为小写"模块"以某种方式保留给pragma(考虑warnings
或strict
)。
另外:调用add
函数不会起作用,因为你混淆了OO代码和常规函数。您的add
需要三个参数,而您只提供两个参数(1
和2
)。
在编写OO模块时,你不应该导出任何东西(甚至不是new
),即:
package Oops;
use strict; use warnings;
use OtherModules;
# don't mention 'Export' at all
sub new {
...
}
sub add {
...
}
1;
然后在你的脚本中:
use strict; use warnings;
use Oops;
my $calculator = Oops->new();
my $result = $calculator->add(1, 2);
print $result, "\n"; # gives 3