Задача в следующем:
Есть ХЕШ %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)]] !!! итп