suppose $my_ref = \$hash{'mary'};
#my_ref
is a reference point to a hash element.
....
later on, how can I use $my_ref
to retrieve the key of the hash element it point to? i.e how to get string 'mary' from $my_ref
?
I ask this question because I have several groups of user name list, some user names appear in multiple groups which consumes memory. So I decide to create a common user name list, and let these groups only store the reference to the corresponding user name rather than user name.
e.g. originally,
%group1 = {'mary'=>1, 'luke'=1,'tom'=1,...}
%group2 = {'mary'=>1, 'sam'=1,'tom'=1,...}
Here you see 'mary' and 'tom' are shown in both group1
and group2
which consume memory. (note I do not care the value in this example, the value is here only because the data struct is a hash). So to reduce memory, I want to have a common list stores all user names:
%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'};
groups only store the reference of the hash element:
%group1 = {$ref1=>1, $ref2=1,$ref3=1,...};
%group2 = {$ref1=>1, $ref4=1,$ref3=1,...};
I think this approach can save much memory because:
- one user name is store in memory once not multiple times;
- groups stores reference (an integer) rather than string (in my case, the length of each user name is 30 bytes in average, while each integer is only 4 bytes (32 bit sys.) or 8 bytes (64 bit sys.)) (BTW, correct me if an integer does not use 4 bytes or 8 bytes.)
- using reference I can access user name immediately without looking for it.
But how can I get the user name from a group?
If I use @my_ref = keys %group1
, I think I will get value of 'mary',but not 'mary'.
$result = $($my_ref[0]);