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'都显示在两者中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'};
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)
我认为这种方法可以节省大量内存,因为:
但是如何从组中获取用户名?
如果我使用@my_ref = keys %group1,我想我会得到'玛丽'的价值,但不是'玛丽'.
$result = $($my_ref[0]);
Run Code Online (Sandbox Code Playgroud)
引用不是整数; 它是一个SV,所以它将是24字节,而不是4字节.
并不重要,因为你没有存储引用,因为哈希键总是字符串.%group1等等哈希的键实际上是看起来像"HASH(0x19838e2)"的字符串,这是无用的.
这并不重要,因为Perl非常聪明,如果将相同的字符串用作多个哈希中的键,则可以避免浪费内存.没错,如果你只是用简单,明显,明智的方式做事,perl会使用比你想要做的复杂事情更少的内存.