首页 > 解决方案 > 将哈希引用转换为数组引用

问题描述

我希望在 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 中的强制转换方法)直接在内存区域中直接对哈希进行操作!?

标签: arraysperlhashcastingreference

解决方案


您不能直接对哈希进行操作,因为 perl 不能那样工作。引用不是 C 意义上的指针。您不能直接访问内存。

哈希和数组在表面上可能看起来相似 - 因为您可以在它们之间进行转换:

my @array = %hash; 
   %hash = @array; 

它“有效”。但这掩盖了在幕后,他们是不同的野兽。@array仍然是元素的有序列表。%hash仍然是一个非确定性的有序字典。这个工作的原因是因为%hash在列表上下文中枚举 a 会返回成对的值。您可以使用成对值列表填充散列。

确实,差不多就是这样;

my %hash = ( 'January' => 'Jan',
             'February' => 'Feb');

实际上是在做。您正在为哈希提供一个列表,并且它正在用它做正确的事情 - 将“键”与“值”关联为配对值。(=>与逗号基本相同,但经常这样使用,因为它更清楚地显示了键值关联)。

这是一篇关于哈希如何工作的旧文章——它在中间发生了一些变化,但原理是相似的——有桶,哈希键基于内部算法映射到桶中。

当您在列表上下文中枚举整个散列时 - 它每次都以有效的随机顺序返回键值对,因为这就是它使用散列查找机制在幕后“工作”的方式。

但这意味着寻找“真正的数组引用”和“直接在哈希上操作”并没有真正的意义——perl不支持像在 中那样做C,因为这不是语言的工作方式。

如果你真的想知道幕后发生的事情——perlguts会给你很多细节。但这与在perl.


推荐阅读