предположим, $my_ref = \$hash{'mary'};
#my_ref
- это контрольная точка для хеш-элемента.
....
позже, как я могу использовать $my_ref
, чтобы получить ключ хеш-элемента, на который он указывает?т.е. как получить строку 'mary' из $my_ref
?
Я задаю этот вопрос, потому что у меня есть несколько групп списка имен пользователей, некоторые имена пользователей появляются в нескольких группах, которые занимают память.Поэтому я решил создать общий список имен пользователей и позволить этим группам хранить только ссылку на соответствующее имя пользователя, а не имя пользователя.
например, изначально,
%group1 = {'mary'=>1, 'luke'=1,'tom'=1,...}
%group2 = {'mary'=>1, 'sam'=1,'tom'=1,...}
Здесь вы видите, что 'mary' и 'tom' показаны как group1
, так и group2
, которые занимают память.(заметьте, мне все равно значение в этом примере, значение здесь только потому, что структура данных является хешем).Итак, чтобы уменьшить память, я хочу, чтобы в общем списке хранились все имена пользователей:
%common_hash = {'mary'=>1, 'luke'=1,'tom'=1,'sam'=1...};
$ref1 = \$common_hash{'mary'};
$ref2 = \$common_hash{'luke'};
$ref3 = \$common_hash{'tom'};
$ref4 = \$common_hash{'sam'};
группы хранят только ссылку на элемент хеша:
%group1 = {$ref1=>1, $ref2=1,$ref3=1,...};
%group2 = {$ref1=>1, $ref4=1,$ref3=1,...};
Я думаю, что такой подход можетсэкономить много памяти, потому что:
- одно имя пользователя сохраняется в памяти один раз, а не несколько раз;
- groups хранит ссылку (целое число), а не строку (в моем случае, длинукаждое имя пользователя в среднем составляет 30 байтов, а каждое целое число составляет всего 4 байта (32-битный sys.) или 8 байтов (64-битный sys.)) (Кстати, исправьте меня, если целое число не использует 4 байта или 8 байтов.)
- по ссылке. Я могу сразу же получить доступ к имени пользователя, не ища его.
Но как я могу получить имя пользователя из группы?
Если я использую @my_ref = keys %group1
, я думаю, что получу значение «Мэри», но не «Мэри».
$result = $($my_ref[0]);