Perl中的编译错误访问对象的属性时出现问题

时间:2011-04-06 05:25:42

标签: perl

我为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的新手,我不知道我们是否可以使用哈希访问对象的属性。

1 个答案:

答案 0 :(得分:3)

第21行是这样的:

my $SockObj = Comm->new( $self->_serveraddr, $self->_port );

这会因为几个不同的原因而失败:

  1. $self未声明,因此您的use strict会导致错误:'全局符号“$ self”需要在x​​.pm第21行显式包名称。由于您的use strict;(但保留use strict;!)。
  2. $self未定义,因此您报告的错误。您必须先实例化一个设备,然后才能调用它。
  3. _serveraddr不是Device上的方法,它是一个属性。您想要$self->{_serveraddr}来访问属性值,或者更好的是,为它编写一个访问器方法。同样适用于_port