Еще один простой вопрос Perl ... (хэш для массива объектов) - PullRequest
0 голосов
/ 22 февраля 2011

Я работаю над созданием класса Graph в Perl и надеюсь, что каждый Graph будет содержать узлы. Каждый узел имеет некоторые свойства, а также (на данный момент) массив, который содержит ссылки на каждый узел, к которому он подключен. Пока у меня есть это определение узла:

использовать строгое; Пакет Node;

sub new{
my $class = shift;
my @array = ();
my $array_r = \@array;
my $self = {
    code => undef,
name => undef,
country => undef,
continent => undef,
timezone => undef,
coordinates => undef
population => undef,
region => undef,
arrayRef => $array_r,
@_,

}; благослови себя, класс; вернуть $ self; } И все же после вызова следующей функции из моего основного скрипта:

sub getSetArray{
    my $self = shift;
my $param = shift;
my $temp = $self->{arrayRef};
push(@{$temp}, $param) if defined $param;
return $self->{arrayRef};
} 

и попытка перебрать массив узла (который будет содержать больше узлов, к которым он подключен):

my $firstnode = Node->new();  # Node constructor should have @array of
my $secondnode = Node->new();

$firstnode->getSetCode("test"); 
print "The current code is ", $firstnode->getSetCode(), "\n";

my $array_r = $firstnode->getSetArray($secondnode);

$array_r = $firstnode->getSetArray($firstnode);

foreach my $obj (@{$array_r}){
    print $obj;
}

Это распечатывает Node = HASH (0x10092bb00) Node = HASH (0x100907bd8). Что приводит меня к мысли, что я имею дело с массивом, содержащим 2 узла (это то, что я хочу). Но при попытке вызвать любые методы этого $ obj мне говорят, что я

Невозможно вызвать метод "getSetNode" без ссылки на пакет или объект.

Я уже ранее благословил эти два объекта при вызове new на этих узлах. Поэтому я не уверен, почему они не распознаются как узлы, и я не могу назвать их методы ....

РЕДАКТИРОВАТЬ -

foreach my $obj (@{$array_r}){  
    print $obj->getSetCode();
}

, где getSetCode () равен

sub getSetCode{
    my $self = shift;
    my $param = shift;
    $self->{code} = $param if defined $param;
    return $self->{code};
}

1 Ответ

1 голос
/ 22 февраля 2011

Покажите, как вы пытаетесь вызвать getSetNode для $ obj и код getSetNode?

Кстати, $ temp не нужен; Вы можете напрямую сделать:

push @{ $self->{arrayRef} }, $param if defined $param;

Может быть полезно для вас: http://perlmonks.org/?node=References+quick+reference

Также обратите внимание, что вы настраиваете циклическую структуру данных ($ firstnode косвенно ссылается на себя), что perl не будет собирать мусор автоматически, даже если все внешние ссылки исчезнут; Вы можете исправить это (если это даже проблема) с:

if (defined $param) {
    push @{ $self->{arrayRef} }, $param;
    Scalar::Util::weaken( $self->{arrayRef}[-1] ) if $param == $self;
}

Что касается вашей проблемы, поместите весь ваш код (и добавьте отсутствующий в строке координат) в это:

use warnings;
use strict;
package Node;

sub new {
    my $class = shift;
    my @array = ();
    my $array_r = \@array;
    my $self = {
        code => undef,
        name => undef,
        country => undef,
        continent => undef,
        timezone => undef,
        coordinates => undef,
        population => undef,
        region => undef,
        arrayRef => $array_r,
        @_,
    };
    bless $self, $class;
    return $self;
}

sub getSetArray{
    my $self = shift;
    my $param = shift;
    my $temp = $self->{arrayRef};
    push(@{$temp}, $param) if defined $param;
    return $self->{arrayRef};
} 

sub getSetCode{
    my $self = shift;
    my $param = shift;
    $self->{code} = $param if defined $param;
    return $self->{code};
}


my $firstnode = Node->new();  # Node constructor should have @array of
my $secondnode = Node->new();
$secondnode->getSetCode("test2");

$firstnode->getSetCode("test"); 
print "The current code is ", $firstnode->getSetCode(), "\n";

my $array_r = $firstnode->getSetArray($secondnode);

$array_r = $firstnode->getSetArray($firstnode);

foreach my $obj (@{$array_r}){  
    print $obj->getSetCode(), "\n";
}

дает мне этот вывод:

The current code is test
test2
test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...