The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Perl ключ HASHа это указательна на другой HASH возможно?"
Отправлено Krylov, 16-Апр-07 16:17 
Задача в следующем:
Есть ХЕШ %id ключом в этом хешэ является ID пользователя, значением - указатель на другой ХЭШ который всвою очередь содержит описания для данного ID пользователя.

Хочется создать на базе ХЭШа %id новый ХЭШ %new где в качестве ключа хеша %new должно быть значение хэша %id (то есть указатель на хэш с описанием), а в качестве значения должно быть одно из свойст хеша описаний. Все отлично до момента когда я пытаюсь разыменновать ключ хеша %new (см. код со строчкой !!!!).
Вот и возникает вопрос можно ли использовать указатель на хэш в качестве ключа хеша с последующим разыменование этого ключа?

Код:

my @users = qw(d a c b); # Id пользователя
my @size = qw(10 5 20 4);
my @color = qw(red black white green);
my %id = ();
my %new = ();

# формирование ХЭШа %id. Ключ хэша %id - id пользователя,
# значение указатель на хэш %sub содержаший описание
my $i = 0;
foreach my $id (@users){
            # хешь с описанием
            my %sub = (size => "$size[$i]", color => "$color[$i]");
            $i++;
            $id{$id} = \%sub;
    }
# ввыод на экран ключей и значений хэша %id с ключами и значениями
# хэша %sub
foreach my $user_id (keys %id){
    my $ptr = $id{$user_id};
    print "[$user_id => $id{$user_id}]\n";
    foreach my $sb (keys %$ptr){
            print ("\t$sb => $$ptr{$sb}\n");
    }
}
# формирование нового хэша %new из хэша %id
# ключом в хэше %new является указатель на хэш %sub, а значением -
# значение ключа 'size' хеша %sub.

print "\nNew array\n";
foreach my $adr (keys %id){
    my $ptr_adr = $id{$adr};
    $new{$ptr_adr} = $$ptr_adr{'size'};
}
# вывод на экран ключа=>значения хэша %new
foreach my $key (keys %new){
   print "[$key => $new{$key}]\n";
  
   # !!!!!!!!!!!!!!!!!!!!!
   # почему я немогу разыменновать указатель, который являтся ключом хэша
   print "[[%$key]]\n";
}

ВВЫОД ДАННОГО КОДА НА ЭКРАН:
[c => HASH(0x18d65f4)]
    color => white
    size => 20
[a => HASH(0x18d65e8)]
    color => black
    size => 5
[b => HASH(0x18d6690)]
    color => green
    size => 4
[d => HASH(0x18ea2e8)]
    color => red
    size => 10

New array
[HASH(0x18d6690) => 4]
[[%HASH(0x18d6690)]]         !!! тут должно быть green, 4
[HASH(0x18ea2e8) => 10]
[[%HASH(0x18ea2e8)]]         !!! итп
[HASH(0x18d65e8) => 5]
[[%HASH(0x18d65e8)]]         !!! итп
[HASH(0x18d65f4) => 20]
[[%HASH(0x18d65f4)]]         !!! итп

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру