将哈希引用转换为数组引用

Pia*_*33z -1 arrays perl hash casting reference

我想在perl中可以从散列中获取数组引用或将ref散列转换为ref数组!

例如 :

%trad = ('January','Jan','February','Feb');
$ref = \%trad;      # made a reference on hash
$ref2 = [%{$ref}];  # convert ref hash to ref array
Run Code Online (Sandbox Code Playgroud)

以其他方式我们可以写:

$ref2 = [%{\%trad}];
Run Code Online (Sandbox Code Playgroud)

但是这段代码是散列上的ref数组的错觉,因为contruction $ ref = [...]创建了一个对通过Perl复制哈希元素而创建的匿名数组的引用.

您可以通过尝试填充$ ref2指向的数组来查看,这对哈希没有影响!

有没有办法直接在内存区域直接操作哈希,使用真正的引用数组,如C中的cast方法!

Sob*_*que 5

你不能直接对哈希进行操作,因为perl不能那样工作.引用不是C语义中的​​指针.您无法直接访问内存.

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

my @array = %hash; 
   %hash = @array; 
Run Code Online (Sandbox Code Playgroud)

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

的确,那几乎就是这样;

my %hash = ( 'January' => 'Jan',
             'February' => 'Feb');
Run Code Online (Sandbox Code Playgroud)

真正在做.你正在为哈希提供一个列表,它正在用它做正确的事情 - 将'key'与'value'关联为配对值.(=>基本上与逗号相同,但它经常被这样使用,因为显示键值关联更清晰).

这是一篇关于哈希如何工作的旧文章- 它在中间时间有所改变,但原理类似 - 有桶和哈希键基于内部算法映射到桶中.

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

但这意味着寻找一个"真正的数组引用"和"直接在哈希上运行"并不是真正有意义的 - perl不支持你可以这样做C,因为那不是语言的工作方式.

如果你真的想知道幕后发生了什么 - perlguts会给你很多细节.但它与编码过程大多无关perl.