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:
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]);
Sorry, hashes don't work that way. You aren't saving any memory by using a reference instead of a string as a hash key, and furthermore you are:
In either case, the hash key is a scalar, which needs to be stored somewhere. By using a reference as the hash key, now you not only need to store the reference in the hash, but also the value it is referencing, so you are now using more memory.
What led you to believe that you were saving memory by your, cough, novel approach? Have you run a memory profiler against different implementations?
Generally, you cannot get from a hash's value back to its key (although you could traverse the hash table linearly looking for it, if it were unique). If you want to keep track of both a hash key and value, you need to do it yourself. Some common approaches are:
# iterate through the table by key
foreach my $key (keys %hash)
{
# here we have both the key and its corresponding value
print "value at key $key is $hash{$key}\n";
}
# iterate through the table by keys and values
while (my ($key, $value) = each %hash)
{
print "value at key $key is $value, which is the same as $hash{$key}\n";
}
Please read up on how hashes work in the manual. You can also read about the keys and each functions.