Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl и массив как член класса 
V
    Опции темы
REZiaMIX
Дата 18.5.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Если объявляю массив вот так:
Код

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.
как сделать правильно?


--------------------
user posted image
PM MAIL   Вверх
reiserford
Дата 18.5.2012, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 22
Регистрация: 20.3.2012

Репутация: 1
Всего: 1



- our @testArray = []; # или our @testArray = undef;
+ our @testArray;


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

PM   Вверх
DurRandir
Дата 18.5.2012, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



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

Когда приводите пример кода - должна быть возможность его запустить и увидеть то же, что и вы. 
PM   Вверх
REZiaMIX
Дата 18.5.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Код

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


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

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

our @testArray;


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


--------------------
user posted image
PM MAIL   Вверх
DurRandir
Дата 18.5.2012, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



our @testArray - это просто переменная уровня пакета - в обычных терминах это "статический член класса". Почитайте perltoot/perlobj для просветления)
PM   Вверх
REZiaMIX
Дата 18.5.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



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

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

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

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

Это сообщение отредактировал(а) REZiaMIX - 18.5.2012, 13:48


--------------------
user posted image
PM MAIL   Вверх
REZiaMIX
Дата 18.5.2012, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Вопрос решен, делаю так:
Код

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

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

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

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



--------------------
user posted image
PM MAIL   Вверх
vadiml
Дата 18.5.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



Код

our @testArray = [];


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

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

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

Хотя смысла в этом нет если Вы не хотите иметь static данные к своём классе.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0741 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.