【发布时间】:2010-08-01 01:28:46
【问题描述】:
假设 $my_ref = \$hash{'mary'}; #my_ref 是哈希元素的引用点。
....
稍后,我如何使用$my_ref 来检索它指向的哈希元素的键?即如何从$my_ref获取字符串'mary'?
我问这个问题是因为我有几组用户名列表,一些用户名出现在多个组中,这会消耗内存。所以我决定创建一个普通的用户名列表,让这些组只存储对应用户名的引用而不是用户名。
例如原来,
%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 位系统)或 8 个字节(64 位系统.)) (顺便说一句,如果整数不使用 4 个字节或 8 个字节,请纠正我。)
- 使用参考我可以立即访问用户名而无需查找。
但是如何从组中获取用户名?
如果我使用@my_ref = keys %group1,我想我会得到'mary'的值,而不是'mary'。
$result = $($my_ref[0]);
【问题讨论】:
-
%group1=(key=>value,...)和%group1={key=>value,...}做了非常不同的事情。如果您对此一无所知,请启用warnings。