我正在尝试为示波器创建一个函数库,但我似乎无法让其他模块文件发挥得很好。
我所拥有的是Oscope.pm
文件除外。如果需要,我也可以上传。
# 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();
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”。
答案 0 :(得分:6)
Oscope->new('port', 'COM3')
应该是
Oscope::Acquire->new('port', 'COM3')
答案 1 :(得分:0)
答案 2 :(得分:0)
我不会说这是个好主意。您显然希望Oscope::Aquire
能够修补补丁Oscope
。这是可能的,但我建议让Oscope::Acquire
导出一个带有Oscope
参数(more information on exporting)的函数:
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版本之间更改”):
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;