创建一个以数组为键的Perl哈希

时间:2013-06-13 07:09:59

标签: perl

如何将数组(如下例中的元组)放入Perl中的哈希?

%h=();
@a=(1,1);
$h{@a}=1 or $h{\@a}=1??

我尝试使用数组引用,但它不起作用。我该如何使它工作?我希望通过散列来实现去除重复(除此之外)。

3 个答案:

答案 0 :(得分:9)

常规哈希只能有字符串键,因此您需要为数组创建某种哈希函数。一种简单的方法是简单地join您的数组元素,例如

$h{join('-', @a)} = \@a;  # A nice readable separator
$h{join($;, @a)} = \@a;   # A less likely, configurable separator ("\034")

但是这种方法(使用哨兵值)要求你选择一个在钥匙中找不到的角色。以下不会遇到这个问题:

$h{pack('(j/a*)*', @a)} = \@a;

或者,查看Hash::MultiKey,它可以使用更复杂的密钥。

答案 1 :(得分:3)

我尝试使用数组引用,但它不起作用

有趣的是,(新)骆驼书的第361页有一个段落标题: 引用不作为哈希键

是的,你证明了骆驼书的正确性。然后继续使用Tie::RefHash告诉您如何解决它。

我想你应该买这本书。

(顺便说一句,(1,1)可能在Python中被称为元组,但它在Perl中称为列表。)

答案 2 :(得分:1)

使用哈希值删除数组中的重复项:

my %hash;
@hash{@array} = @array;
my @unique = keys %hash;

或者,您可以使用map创建哈希:

my %hash = map {$_ => 1} @array;