如何从哈希元素的引用中获取键

use*_*517 4 perl reference hashref

假设$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,...}
Run Code Online (Sandbox Code Playgroud)

在这里你看到'mary'和'tom'都显示在两者中group1group2消耗内存.(注意我不关心这个例子中的值,这里的值只是因为数据结构是一个哈希值).所以为了减少内存,我希望有一个公共列表存储所有用户名:

%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'};
Run Code Online (Sandbox Code Playgroud)

组仅存储哈希元素的引用:

%group1 = {$ref1=>1, $ref2=1,$ref3=1,...};  
%group2 = {$ref1=>1, $ref4=1,$ref3=1,...}; 
Run Code Online (Sandbox Code Playgroud)

我认为这种方法可以节省大量内存,因为:

  1. 一个用户名一次不存储多次;
  2. groups存储引用(整数)而不是字符串(在我的例子中,每个用户名的长度平均为30个字节,而每个整数只有4个字节(32位sys.)或8个字节(64位sys.)) (顺便说一句,如果一个整数不使用4个字节或8个字节,请纠正我.)
  3. 使用引用我可以立即访问用户名而无需查找.

但是如何从组中获取用户名?

如果我使用@my_ref = keys %group1,我想我会得到'玛丽'的价值,但不是'玛丽'.

$result = $($my_ref[0]);
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 5

  1. 引用不是整数; 它是一个SV,所以它将是24字节,而不是4字节.

  2. 并不重要,因为你没有存储引用,因为哈希键总是字符串.%group1等等哈希的键实际上是看起来像"HASH(0x19838e2)"的字符串,这是无用的.

  3. 这并不重要,因为Perl非常聪明,如果将相同的字符串用作多个哈希中的键,则可以避免浪费内存.没错,如果你只是用简单,明显,明智的方式做事,perl会使用比你想要做的复杂事情更少的内存.