Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > perl и массив как член класса


Автор: REZiaMIX 18.5.2012, 13:15
Если объявляю массив вот так:
Код

my @testArray =
#    (    
#        "element1",
#        "element2",
#        "element3",
#        "element4",
#        "element5",
#        "element6",
#        "element7",
#        "element8",
#    );


тогда print @testArray выдает правильный результат

если делаю вот так:
Код

package TestPackage;
our @ISA = qw(TestPackageParent);
our @testArray = []; # или our @testArray = undef; 

sub new
{
    my ($proto) = shift;
    my $self = $proto->SUPER::new($_[0]);
    bless $self,$proto;
    return $self;
}

sub SomeSub()
{
        my ($self) = @_;
        $self{@testArray} = ("element1","element2","element3");
}



тогда print выдает только последний элемент element3.
как сделать правильно?

Автор: reiserford 18.5.2012, 13:18
- our @testArray = []; # или our @testArray = undef;
+ our @testArray;


Что вы хотели сказать вот этим?
$self{@testArray} = ("element1","element2","element3");

Автор: DurRandir 18.5.2012, 13:20
1. Где у вас тут print?
2. Что творится в родительском классе? 
3. our @testArray = [] - вы в массив записали один элемент - ссылку на пустой анонимный массив.
4. $self{@testArray} - это вообще-то срез хэша. Причём где этот хэш определили - непонятно (п.2), что распечатывали - непонятно (п.1)

Когда приводите пример кода - должна быть возможность его запустить и увидеть то же, что и вы. 

Автор: REZiaMIX 18.5.2012, 13:23
Код

$self{@testArray} = ("element1","element2","element3");


этим пытался присвоить @testArray, как члену класса новое значение - массив ("element1","element2","element3");
П.С. я пишу на плюсах , в перле новичек smile

Добавлено через 1 минуту и 54 секунды
тогда вопрос другой , объявили мы массив в классе:
Код

our @testArray;


как получить к нему доступ из саба , и присвоить новые значения?

Автор: DurRandir 18.5.2012, 13:36
our @testArray - это просто переменная уровня пакета - в обычных терминах это "статический член класса". Почитайте perltoot/perlobj для просветления)

Автор: REZiaMIX 18.5.2012, 13:44
Цитата(DurRandir @ 18.5.2012,  13:36)
our @testArray - это просто переменная уровня пакета - в обычных терминах это "статический член класса". Почитайте perltoot/perlobj для просветления)

я понимаю, что это переменная уровня пакета(или стат. член класса), так вопрос не в том, вопрос в том , как правильно к ней обратиться из саба и установить новое значение, в моем случае - новый массив.
Если к обычным переменным я обращаюсь через 
Код

$self->{$variableName} = "someValue"

то с массивом так не выходит

Автор: REZiaMIX 18.5.2012, 14:20
Вопрос решен, делаю так:
Код

#объявляем
our @testArray = [];

#устанавливаем значение в сабе
sub SomeSub()
{
        $self->{testArray} = 
    ["element1","element2" ..... ];
}

# получаем доступ

sub AnotherSub()
{
        foreach (@{$self->{'testArray'}}) 
    {    
        print "element".$_."\n";
        }
}

Автор: vadiml 18.5.2012, 15:39
Код

our @testArray = [];


А зачем это нужно было?

our @testArray и @{$self->{'testArray'}} -- это разные, ни как не связанные массивы.

Ладно если б Вы сделали $self->{'testArray'} = \@testArray, то имели бы 2 способа обращения к массиву:
@TestPackage::testArray и @{$self->{'testArray'}}

Хотя смысла в этом нет если Вы не хотите иметь static данные к своём классе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)