【问题标题】:Create a Perl hash with an array as the key创建一个以数组为键的 Perl 哈希
【发布时间】:2014-05-03 00:14:42
【问题描述】:

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

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

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

【问题讨论】:

  • 您需要为您的数组设计自己的哈希算法,然后将其用作您的密钥。
  • 你能举个例子吗?
  • 这是不可能的:所有键都必须是字符串。但是,您可以连接数组的各个部分以形成一个带有字符的键,您可以保证不会出现在值中。这可能是一个 NUL 字节:$h{join "\x00", @a} = 1.
  • @mpapec 这是古老的多维数组仿真(在语言中没有引用之前)。这些项目由$; 连接以形成一个密钥。这值得鼓励。有关说明,请参阅 perlvar
  • @mpapec:$; 的默认值 - 下标分隔符。选择该值是因为它与 AWK 用于 SUBSEP 的值相同。在perlvar 阅读它。

标签: perl


【解决方案1】:

常规散列只能有字符串键,所以你需要为你的数组创建某种散列函数。一种简单的方法是简单地 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,它可以采用更复杂的密钥。

【讨论】:

    【解决方案2】:

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

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

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

    我想你应该买这本书。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • -1:没有解决 OP 无法使用非标量值作为哈希键的问题。
      • 我不同意。它处理了他真正的问题(在帖子的末尾),即使用哈希对数组进行重复数据删除。这向我表明,他试图通过将数组设置为哈希键来实现的目的是将数组中的每个元素分配为哈希中的单独键。
      • 同意它展示了如何使用哈希对数据集进行去重,但我对问题的解读是该集中的数据元素是元组,而不是每个元组的元素。因此,如果他不能将元组用作键,则无法使用keys 进行重复数据删除。也许 OP 可以澄清他到底在重复什么?
      猜你喜欢
      • 2016-01-25
      • 2011-05-08
      • 2011-04-20
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      相关资源
      最近更新 更多