使用Perl模块

时间:2014-02-28 17:09:44

标签: perl oop perl-module

我正在尝试为示波器创建一个函数库,但我似乎无法让其他模块文件发挥得很好。

我所拥有的是Oscope.pm文件除外。如果需要,我也可以上传。

test.pl

# Includes
use 5.012;
use Oscope;
use Oscope::Acquire;
use warnings;

# From Oscope.pm
my $scope = Oscope->new('port', 'COM3');

# From Oscope::Acquire.pm
$scope->QueryAcquire();

oscope需要/ Acquire.pm

package Oscope::Acquire;

use Oscope;
use parent 'Oscope';

sub QueryAcquire
{
   my ($self) = @_;
   # Oscope.pm
   my $message = $self->Send('ACQUIRE?');
   return();
}

1;

输出

  

无法通过C:\ Documents and Settings \ ericfoss \ My Documents \ Slick \ Perl \ tests \ Test.pl第11行中的“Oscope”软件包找到对象方法“QueryAcquire”。

4 个答案:

答案 0 :(得分:6)

Oscope->new('port', 'COM3')

应该是

Oscope::Acquire->new('port', 'COM3')

答案 1 :(得分:0)

您的lib包在哪里,将代码放在那里。你也可以使用

use lib "path"

可以找到另一个解释here,其答案需要超过lib。

您所在的区域信息表明它无法找到该功能。

答案 2 :(得分:0)

我不会说这是个好主意。您显然希望Oscope::Aquire能够修补补丁Oscope。这是可能的,但我建议让Oscope::Acquire导出一个带有Oscope参数(more information on exporting)的函数:

oscope需要/ Acquire.pm

package Oscope::Acquire;
require Exporter 'import';
@EXPORT_OK = qw{QueryAcquire};

use Oscope;

sub QueryAcquire
{
    my ($oscope) = @_;
    my $message = $oscope->Send('ACQUIRE?');
    return $message;
}

1;

您将使用:

use Oscope;
use Oscope::Acquire 'QueryAcquire';

my $oscope = Oscope->new();
print QueryAquire($oscope);

但是,如果你真的想要$oscope->QueryAcquire()语法,并且你不想把它放在Oscope本身,你就可以修补模块。 Perl文档将其称为modifying the module's symbol table through a typeglob,并且显然已弃用(“直接创建新符号表条目的结果...未定义且可在perl版本之间更改”):

oscope需要/ Acquire.pm

package Oscope::Acquire;

use Oscope;

*Oscope::QueryAcquire = sub {
    my ($self) = @_;
    my $message = $self->Send('ACQUIRE?');
    return $message;
}

1;

我应该更仔细地阅读自己的链接。似乎批准的方法是简单地将方法添加到Oscope文件中的Oscope/Acquire.pm包中(“您可以通过显式限定子例程的名称来定义其包外的子例程”) :

package Oscope::Acquire;
use Oscope;

...

sub Oscope::QueryAcquire {
    my ($self) = @_;
    my $message = $self->Send('ACQUIRE?');
    return $message;
}

1;

也就是说,没有必要使用typeglob。

答案 3 :(得分:-2)

代码代表您可以说$scope->Oscope::Acquire::QueryAcquire();,但要获得所需的效果,您需要将其作为包的一部分。

package Oscope;

sub QueryAcquire
{
   # Code here
}

1;