无法使用perl中的Exporter模块导出方法

时间:2017-10-07 17:37:50

标签: perl perl-module

我尝试使用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}}包中的原因

我哪里错了?

1 个答案:

答案 0 :(得分:3)

ops是一个pragma already used by Perl。来自文档:

  

ops - Perl编译指示在编译时限制不安全的操作

我不知道这究竟意味着什么,但这就是问题所在。

将你的模块重命名为其他东西,最好用@simbabque在评论中建议的大写字符,因为小写"模块"以某种方式保留给pragma(考虑warningsstrict)。

另外:调用add函数不会起作用,因为你混淆了OO代码和常规函数。您的add需要三个参数,而您只提供两个参数(12)。

在编写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