2011-04-06 61 views
0

我已经为C#工具编写了几个perl包装器模块。这个想法是,脚本会传递一个设备名称,端口号和用于建立通信套接字的服务器地址。当我写一个脚本来使用这些模块我得到一个编译失败的错误需要编译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; 
} 

有人可以请help..I不知道如何移动forward..Please让我知道如果这个问题不清楚..

我认为问题是,在这条线

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

$自包含未定义值。我如何解决?无论如何,我是perl的新手,我不知道我们是否可以使用散列来访问对象的属性。

回答

3

21行是这样的:

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

这将几种不同的原因而失败:

  1. $self没有声明所以你use strict应该导致错误:“全局符号 “$自我”需要在x.pm第21行显式包名。“由于你的use strict;(但在那里留下use strict;!)。
  2. $self未定义,因此您报告的错误。你必须实例化一个设备,然后才能调用它的方法。
  3. _serveraddr不是Device上的方法,它是一个属性。你想要说$self->{_serveraddr}来访问属性值,或者更好的是写一个访问器方法。 _port也一样。
+0

此外,在'Launch.pl'中,127.0.0.1不是您认为的那样。 – Grrrr 2011-04-06 13:04:14