我为C#工具编写了几个perl包装器模块。我们的想法是脚本将传递用于建立通信套接字的设备名称,端口号和服务器地址。当我编写脚本来使用这些模块时,我在编译失败时遇到了错误
"Can't call method "_serveraddr" on an undefined value at Device.pm line 23.
Compilation failed in require at Launch.pl line 11.
BEGIN failed--compilation aborted at Launch.pl line 11."
Launch.pl
use Device;
use System;
my ( $serverAddress, $port, $reportFile ) = @_;
my $System = new System($serverAddress, $port);
my $dut = new Device('DEV',127.0.0.1,5000);
Device.pm
package Device;
use strict;
use warnings;
use Command;
use Comm;
sub new {
my $class = shift;
my $self = {
_device => shift,
_serveraddr => shift,
_port => shift
};
bless $self, $class;
return $self;
}
my $SockObj = Comm->new( $self->_serveraddr, $self->_port );
my $ComObj = Comm->new();
sub Action1 {
my ( $self, $x, $y ) = @_;
my $tmp = {
'hash1' => 'Command',
'value1' => $x,
'value2' => $y,
'Device' => $self->{_device}
};
$InputRequest = $ComObj->CreateInputString($tmp);
$SockObj->WriteInfo($InputRequest);
my $Response = $SockObj->ReadData();
$ComObj->TapResponse($Response);
}
System.pm
package System;
use strict;
use warnings;
use Comm;
use Command;
my $SockObj = Comm->new();
my $ComObj = Command->new();
sub new {
my $class = shift;
my $self = {
_serveraddr => shift,
_port => shift
};
bless $self, $class;
return $self;
}
有人可以请帮忙..我不知道如何前进......如果问题不清楚,请告诉我。
我认为问题在于,在这一行
my $SockObj = Comm->new( $self->_serveraddr, $self->_port );
$ self包含未定义的值。我该如何解决?不过,我是perl的新手,我不知道我们是否可以使用哈希访问对象的属性。
答案 0 :(得分:3)
第21行是这样的:
my $SockObj = Comm->new( $self->_serveraddr, $self->_port );
这会因为几个不同的原因而失败:
$self
未声明,因此您的use strict
会导致错误:'全局符号“$ self”需要在x.pm第21行显式包名称。由于您的use strict;
(但保留use strict;
!)。$self
未定义,因此您报告的错误。您必须先实例化一个设备,然后才能调用它。_serveraddr
不是Device上的方法,它是一个属性。您想要$self->{_serveraddr}
来访问属性值,或者更好的是,为它编写一个访问器方法。同样适用于_port
。