LINUX.ORG.RU

История изменений

Исправление gh0stwizard, (текущая версия) :

Можно ли как-то вот этак сделать в Perl или категорически нельзя?

И можно и нельзя. В классическом ООП перла это нельзя, т.к. нету нужных средств. С помощью костылей это возможно, смотри caller(), import и AUTOLOAD. Этот вариант называется хаком, обходом привычного хода вещей. Вместо этого придумали Moo.

Кстати, хранение всех собственных данных объекта в каком-нибудь громадном хэше

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

все эти многоуровневые индексы куда менее эффективны

Индекс строится для каждой структуры (хэш, массив) отдельно и эффективны также как и без вложенности.

$ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'}

Тут только проблема в цене разыменовывания. Если сделать по-классике, т.е. как в принято в Си, на котором написан перл:

my $hash_vars_a = $ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'};

for (keys %$hash_vars_a) {
   my $value = $hash_vars_a->{$_};
   ...
}
То код будет также эффективно работать. Ибо перл работает с адресами, а не «путями» из первоначальной структуры. Ты можешь вайпнуть все остальное, оставив кусок структуры с адресом:
my $options = delete $ObjectData{refaddr $self}{'options'};
# cleanup
$ObjectData{refaddr $self} = ();
%ObjectData = ();
undef %ObjectData; # Non-necessary: called explicity because we want this right now.

простые переменные

Верно. И велосипедить хэш, хэш-функции? За тебя люди уже постарались и делают это на отлично.

P.S. Проблема перла (тикля в том числе) при работе с хэшами и массивами только одна: оптимистичное выделение памяти (никогда не возращается в ОС) и размер минимальной длины значения. Последнее означает, что массив из 1 млн. чисел в 32 байта будет куда больше, чем ты ожидаешь. Решено, через XS (модуль Bit:Vector).

Исходная версия gh0stwizard, :

Можно ли как-то вот этак сделать в Perl или категорически нельзя?

И можно и нельзя. В классическом ООП перла это нельзя, т.к. нету нужных средств. С помощью костылей это возможно, смотри caller(), import и AUTOLOAD. Этот вариант называется хаком, обходом привычного хода вещей. Вместо этого придумали Moo.

Кстати, хранение всех собственных данных объекта в каком-нибудь громадном хэше

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

все эти многоуровневые индексы куда менее эффективны

Индекс строится для каждой структуры (хэш, массив) отдельно и эффективны также как и без вложенности.

$ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'}

Тут только проблема в цене разыменовывания. Если сделать по-классике, т.е. как в принято в Си, на котором написан перл:

my $hash_vars_a = $ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'};

for (keys %$hash_vars_a) {
   my $value = $hash_vars_a->{$_};
   ...
}
То код будет также эффективно работать. Ибо перл работает с адресами, а не «путями» из первоначальной структуры. Ты можешь вайпнуть все остальное, оставив кусок структуры с адресом:
my $options = delete $ObjectData{refaddr $self}{'options'};
# cleanup
$ObjectData{refaddr $self} = ();
%ObjectData = ();
undef %ObjectData; # Non-necessary: called explicity because we want this right now.

простые переменные

Верно. И велосипедить хэш, хэш-функции? За тебя люди уже постарались и делают это на отлично.