Ошибка компиляции в Perl при доступе к атрибутам объекта - PullRequest
0 голосов
/ 06 апреля 2011

Я написал пару модулей оболочки Perl для инструмента C #.Идея состоит в том, что скрипт передаст имя устройства, номер порта и адрес сервера, которые используются для установления коммуникационного сокета.Когда я пишу сценарий для использования этих модулей, я получаю сообщение "Ошибка компиляции требует ошибки

"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 Ответ

3 голосов
/ 06 апреля 2011

Строка 21 такова:

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

И это не удастся по нескольким причинам:

  1. $self не объявлено, поэтому ваш use strict должен вызвать ошибку: «Глобальному символу« $ self »требуется явное имя пакета в строке 21 x.pm». из-за вашего use strict; (но оставьте это use strict; там!).
  2. $self не определено, следовательно, ошибка, о которой вы сообщаете. Вам придется создать экземпляр устройства, прежде чем вы сможете вызывать методы на нем.
  3. _serveraddr это не метод на устройстве, это атрибут. Вы хотите сказать $self->{_serveraddr}, чтобы получить доступ к значению атрибута или, лучше, написать метод доступа для него. То же самое касается _port.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...