假设$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,...};
我认为这种方法可以节省大量内存,因为:
- 一个用户名在内存中存储一次而不是多次;
- 组存储引用(整数)而不是字符串(在我的情况下,每个用户名的长度平均为 30 个字节,而每个整数只有 4 个字节(32 位系统)或 8 个字节(64 位系统)) (顺便说一句,如果整数不使用 4 个字节或 8 个字节,请纠正我。)
- 使用参考我可以立即访问用户名而无需查找。
但是如何从组中获取用户名?
如果我使用@my_ref = keys %group1
,我想我会得到 'mary' 的值,而不是 'mary'。
$result = $($my_ref[0]);