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

时间:2018-05-09 10:07:17

标签: 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

以其他方式我们可以写:

$ref2 = [%{\%trad}];

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

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

有没有办法直接在内存区域直接操作哈希,使用像C中的cast方法一样的真实引用数组?

2 个答案:

答案 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得到结果。

我知道,有很多方法可以达到相同的目标,但我发现这种方法更“优雅”,我相信在记忆中不那么完美:-( 实际上不是因为它创建了一个带有哈希数据的匿名数组: - (