7

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

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

我尝试使用数组引用,但它不起作用。我该如何让它发挥作用?我想通过进行散列(除其他外)来消除重复数据。

4

3 回答 3

11

常规散列只能具有字符串键,因此您需要为数组创建某种散列函数。一个简单的方法是简单地加入你的数组元素,例如

$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可以采用更复杂的密钥。

于 2013-06-13T07:16:55.673 回答
4

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

有趣的是,(新)Camel 书的第 361 页有一个段落标题: References Don't Work As Hash Keys

所以是的,你证明了骆驼书是对的。然后它继续告诉您如何使用 Tie::RefHash修复它。

我想你应该买这本书。

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

于 2013-06-13T07:27:40.733 回答
2

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

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

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

my %hash = map {$_ => 1} @array;
于 2013-06-13T08:16:05.743 回答