我想在perl中可以从散列中获取数组引用或将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 = [...] 会创建对通过Perl复制哈希元素而创建的匿名数组的引用。
你可以通过尝试填充$ ref2所指向的数组来看到这对哈希没有影响!
有没有办法直接在内存区域直接操作哈希,使用像C中的cast方法一样的真实引用数组?
答案 0 :(得分:5)
你不能直接对哈希进行操作,因为perl不能那样工作。引用不是C语义中的指针。您无法直接访问内存。
哈希和数组在表面上可能看起来相似 - 因为你可以在它们之间使用:
进行转换my @array = %hash;
%hash = @array;
它'有效'。但这掩盖了幕后的情况,他们是不同的野兽。 @array
仍然是有序的元素列表。 %hash
仍然是一个非确定性的有序字典。这项工作的原因是因为在列表上下文中枚举%hash
,返回配对值。您可以使用配对值列表填充哈希值。
确实,这几乎是什么;
my %hash = ( 'January' => 'Jan',
'February' => 'Feb');
实际正在做什么。你正在为哈希提供一个列表,它正在用它做正确的事情 - 将'key'与'value'关联为配对值。 (=>
与逗号基本相同,但它经常被这样使用,因为显示键值关联更清晰。
这是关于how hashes work的一篇较旧的文章 - 它在中间时间有所改变,但原理类似 - 存在桶,并且哈希键基于内部算法映射到桶中。
当您在列表上下文中枚举整个哈希值时 - 它每次都以有效的随机顺序返回键值对,因为这就是它在后台使用哈希查找机制“工作”的方式。
但是这意味着寻找“真正的数组引用”和“直接在哈希上运行”并没有多大意义 - perl
不支持像C
中那样做,因为这不是语言的运作方式。
如果真的想知道幕后发生的事情 - perlguts
会给你很多细节。但它与perl
中的编码过程大多无关。
答案 1 :(得分:0)
好的,现在对我来说更清楚了。感谢花时间回答我的问题。
有效地,我的困惑是相信Perl引用的工作类似于C中的引用。
我发现这篇文章http://www.perlmonks.org/?node_id=504196解释了这个技巧,但它并不准确这个新的引用创建绑定到匿名数组或哈希:-(
遗憾的是,我们不能这样做,在某些情况下它可能会有用。
例如,为了获得散列的大小(键/值的数量),我们可以写:
$size_hash = ( $#{ [ %{\%hash} ] } +1 ) / 2;
我使用来自Hash的引用转换为数组引用,之后我们可以很容易地得到这个数组的大小并除以2得到结果。
我知道,有很多方法可以达到相同的目标,但我发现这种方法更“优雅”,我相信在记忆中不那么完美:-( 实际上不是因为它创建了一个带有哈希数据的匿名数组: - (