0

我将尝试用一个例子来说明这一点。举一个 Hash of Hash 的常见示例:

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

出于我的目的,我希望能够将未命名或匿名哈希添加到 %HOH。直到运行时,我才需要(或能够)定义这些子哈希。我怎样才能用 Perl 做到这一点?

我读过的所有内容(我已经读过 Perldocs 和 Google 的内容)似乎都显示了定义所有 sub-hahes(例如“flintstones”、“jetsons”和“simpsons”)的示例。

我正在做的是尝试构建一个父哈希,它将包含来自 CSV 文件的行的子哈希:

%TopHash = (
   %Line1 => {
      cell01 => $some_value1a;
      cell02 => $some_value2a;
      cell03 => $some_value3a;
   },
   %Line2 => {
      cell01 => $some_value1b;
      cell02 => $some_value2b;
      cell03 => $some_value3b;
   },
   %Line3 => {
      cell01 => $some_value1c;
      cell02 => $some_value2c;
      cell03 => $some_value3c;
   },
# etc
# etc
# etc

    );

直到运行时才知道我需要的“%LineX”哈希的数量(因为它们代表在运行时读取的 CSV 中的行数)。

有任何想法吗?如果还不清楚......我仍然试图围绕 Perl 散列。

4

4 回答 4

3

要在运行时添加匿名哈希,请像分配普通哈希元素一样分配它:

$HoH{key} = { foo => 42 };

或者

$HoH{key} = $hash_ref;

或者

$HoH{key} = \%hash;
于 2009-10-29T16:58:26.013 回答
1

首先,您从正在解析的当前行创建哈希

my %lineHash = (
    cell01 => $some_value1a,
    cell02 => $some_value1b,
    cell03 => $some_value1c
);

或直接创建对哈希的引用

my $lineHashRef = {
    cell01 => $some_value2a,
    cell02 => $some_value2b,
    cell03 => $some_value2c
};

然后你将它添加到你的整体散列中,记住嵌套的 perl 结构只包含对其他结构的引用。

$topHash{line1} = \%lineHash;
$topHash{line2} = $lineHashRef;

更新 的示例给出了要解析的数据数组的循环

my %topHash;
foreach my $i (0 .. $#data) {
    my %tempHash;
    // stuff here to parse $data[$i] and populate %tempHash
    $topHash{"line$i"} = \%tempHash;
}
于 2009-10-29T16:57:35.943 回答
1
#!/usr/bin/perl

use strict;

my %HoH = (
    line01 => {
        cell01 => "cell0101",
        cell02 => "cell0102",
        cell03 => "cell0103"
    }
);

$HoH{"line02"}    =
    {
        cell01 => "cell0201",
        cell02 => "cell0202",
        cell03 => "cell0203"
    };

foreach my $hohKey (keys %HoH)
{
    my $newHash = $HoH{$hohKey};
    print "Line Name: $hohKey\n";
    foreach my $key (keys %$newHash)
    {
        print "\t$key => ", $newHash->{$key}, "\n";
    }
}
于 2009-10-29T16:58:37.823 回答
0

每次你从一行数据创建一个新的散列时,你都需要考虑一个唯一的键来将该数据存储在你的顶级散列表中。

my $line = 1;
my %HoH;
while (<>) {
    my ($cell01, $cell02, $cell03, @etc) = split /,/;
    my $newHash = { cell01 => $cell01, cell02 => $cell02, ... };
    my $key = "line$line";
    $HoH{$key} = $newHash;
    $line++;
}

现在keys(%HoH)将返回一个(未排序的)列表,如"line1","line2","line3",....
$HoH{"line5"}将返回对文件第 5 行数据的引用。
%{$HoH{"line7"}}是一种丑陋的语法,但它从第 7 行返回数据的哈希表。
$HoH{"line14"}{"cell02"}可用于获取特定的数据。

于 2009-10-29T17:20:03.697 回答