【问题标题】:Perl - Hash Table and foreach statementPerl - 哈希表和 foreach 语句
【发布时间】:2014-08-01 21:23:59
【问题描述】:

我对 perl 哈希有点困惑。

我知道你可以通过调用来创建哈希:

my %hashTable;

$hashTable("Key") = "Value"

稍后,如果您想检索该值,您可以这样做

print $hashTable("Key")

但是,我对这个 for 循环感到困惑

foreach (keys %{$hashTable{"key"}})
{
    print $_
}

如果没有 %{$hashTable{"key"}},它看起来会打印出每个键,但是如果你在哈希表前面执行 % 会发生什么?

我试图测试这个函数,给它一个名为“key”的键,它会给我一个错误:不能使用字符串(“key”)作为哈希引用。和多维哈希表有关系吗?

【问题讨论】:

  • 我认为这可行的唯一方法是散列 hashTable 包含自身,作为值,散列。所以$hashTable{"key"} 会返回一个哈希值。
  • 您的意思是在其中一个键值对中包含另一个哈希表吗?
  • 是的。在散列 hashTable 和键 "key" 中,值本身就是散列(您可以混合值包含的内容,无论是标量、数组还是散列)。 keys %{$hashTable{"key"}} 行从该值哈希返回键。
  • 啊啊啊啊!!!现在我懂了。感谢您的帮助!
  • 是的,您在子哈希的键上进行迭代。查看perldsc - Perl Data Structures Cookbook 了解有关此类结构的更多信息。

标签: perl


【解决方案1】:

发生的情况是您有一个名为%hashTable 的哈希。它有一个键为key 的值,它的值是另一个哈希表

所以代码:

foreach (keys %{$hashTable{"key"}})
{
    print $_
}

正在遍历第二个哈希,并打印出其中包含的键。

这是一个使用 the documentation link 的示例,Miller 提供:

#!/usr/bin/perl

use strict;
use warnings;

my %HoH = (
    flintstones => {
        lead => "fred",
        pal => "barney",
    },
    jetsons => {
        lead => "george",
        wife => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        lead => "homer",
        wife => "marge",
        kid => "bart",
    },
);

foreach (keys %{$HoH{"flintstones"}})
{
    print $_."\n";
}

这有输出:

lead
pal

【讨论】:

    【解决方案2】:

    把你的hashTable想象成

    key1:           <-+
        value1        |
    key2:             |
        value2        += this is your hashTable, with 3x key/value
    key3:             |
        value3      <-+
    

    现在更改 keyN 的值 - 因此,它不会包含 标量 值,而是另一个哈希值,例如:

    key1:
        subkey1a: subval1a      <-+ this "HASH" is the value for the "key1".
        subkey1b: subval1b      <-|
    key2:
        subkey2a: subval2a
    key3:
        subkey3a: subval3a
        subkey3b: subval3b
        subkey3c: subval3c
    

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多