如何在哈希表中插入哈希的哈希?

3
我想从一个空哈希开始,然后将相同类型的哈希的哈希插入到该哈希中。
#!/usr/bin/perl

use strict;
use warnings;

my %h = {};

$h{"1"} => {
    a => -1,
    b => -1,
    c => [
    {
        d => -1,
        e => -1,
    },
    ],
};

然而,这会导致...
Useless use of hash element in void context at ./hash.pl line 8.
Useless use of anonymous hash ({}) in void context at ./hash.pl line 8.
Reference found where even-sized list expected at ./hash.pl line 6.

我想创建一个类似数据库的东西,我可以在其中插入$h{"1"}等删除结构。你有什么好的想法吗?

7
嘿,我听说你喜欢哈希,所以我在你的哈希里加了一个哈希,这样当你查找时就可以同时查找两个哈希了。 - BoltClock
2个回答

9

要初始化一个哈希表,你可以使用%h = ()
{}是一个空匿名哈希表的引用。试试这个:

my %h = ();

$h{"1"} = {
    a => -1,
    b => -1,
    c => [{
        d => -1,
        e => -1,
    }],
};

当我尝试使用XML:Simple模块读取XML时,我遇到了这些复杂的哈希表。读取很简单,但是处理结果中的哈希表和数组让我头疼(我是PERL初学者)。
  • 如何在上面的示例中访问元素“d”?
  • 有哪些方法可以循环遍历所有这些值?
谢谢,Mika
- user628446
1
Mika,请打开一个新的问题,而不是在评论部分附加问题。 - daxim
Mika,你可以用$h{1}{c}[0]{d}获取'd'元素,并获得值-1。正如daxim所说,如果你想要一个更详细的答案,请开一个新问题。 - friedo

3

注意:引用始终是标量,因为它们包含地址(类似于整洁思考)

在创建嵌套数据结构时,请记住,在Perl中,我们不必担心空间分配方式以及分配了多少空间。它非常适合处理自己的匿名存储。

但是,始终记住创建此类存储的基本规则:

要创建匿名数组,请使用方括号而不是括号:

$ra = [ ];

要创建一个匿名哈希,请使用大括号而不是方括号:
$rh = { };

这就是全部内容了。
现在,你写的大致如下:
my %h={};

您实质上是在创建一个哈希,并用一个标量引用来初始化它。

这就是为什么您的程序会抱怨的原因,

只需删除那一行并像这样重写您的代码即可,

#!/usr/bin/perl

use strict;
use warnings;

my $h={"1" => {
            a => -1,
            b => -1,
            c => [
                 {
                   d => -1,
                   e => -1,
                 },
                 ],
              }
};

Perl会处理剩下的部分,享受Perl的乐趣 :) :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接