arrays - 将哈希引用转换为数组引用
问题描述
我希望在 perl 中可以从哈希中获取数组 ref 或将 ref 哈希转换为 ref 数组!?
例如 :
%trad = ('January','Jan','February','Feb');
$ref = \%trad; # made a reference on hash
$ref2 = [%{$ref}]; # convert ref hash to ref array
以其他方式我们可以写:
$ref2 = [%{\%trad}];
但是这段代码是散列上的 ref 数组的错觉,因为构造$ref = [...]创建了对通过 Perl 从散列中复制元素创建的匿名数组的引用。
您可以通过尝试填充 $ref2 指向的数组来看到这一点,这对 hash 没有影响!
有没有办法通过在 C 中使用真正的 ref 数组(如 C 中的强制转换方法)直接在内存区域中直接对哈希进行操作!?
解决方案
您不能直接对哈希进行操作,因为 perl 不能那样工作。引用不是 C 意义上的指针。您不能直接访问内存。
哈希和数组在表面上可能看起来相似 - 因为您可以在它们之间进行转换:
my @array = %hash;
%hash = @array;
它“有效”。但这掩盖了在幕后,他们是不同的野兽。@array
仍然是元素的有序列表。%hash
仍然是一个非确定性的有序字典。这个工作的原因是因为%hash
在列表上下文中枚举 a 会返回成对的值。您可以使用成对值列表填充散列。
确实,差不多就是这样;
my %hash = ( 'January' => 'Jan',
'February' => 'Feb');
实际上是在做。您正在为哈希提供一个列表,并且它正在用它做正确的事情 - 将“键”与“值”关联为配对值。(=>
与逗号基本相同,但经常这样使用,因为它更清楚地显示了键值关联)。
这是一篇关于哈希如何工作的旧文章——它在中间发生了一些变化,但原理是相似的——有桶,哈希键基于内部算法映射到桶中。
当您在列表上下文中枚举整个散列时 - 它每次都以有效的随机顺序返回键值对,因为这就是它使用散列查找机制在幕后“工作”的方式。
但这意味着寻找“真正的数组引用”和“直接在哈希上操作”并没有真正的意义——perl
不支持像在 中那样做C
,因为这不是语言的工作方式。
如果你真的想知道幕后发生的事情——perlguts
会给你很多细节。但这与在perl
.
推荐阅读
- python - 如何创建一个函数来动态创建一个范围内的元组列表?
- reactjs - 使用 react 和 express 设置 nginx
- optaplanner - Optaplanner ConstraintsStream 用负整数惩罚
- python - Python找不到正确的Mysqlclient
- javascript - Javascript:使用按钮 Onclick 函数创建多个 Li 项目
- artificial-intelligence - 人工智能一种现代方法 - 随时间推移的概率推理
- javascript - 通过 Android Volley 发送 POST 请求时发生服务器错误
- java - 相同实体关系的休眠辅助表
- angular - 登录后导航(Angular)
- javascript - 添加列表项不是添加所有的innerHTML