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方法!
你不能直接对哈希进行操作,因为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
.