我会试图说明这一个例子。采取的一个常见的例子的一个哈哈希:

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和谷歌会已经)似乎表示其所有子hahes(例如"摩登原始人","罗茜和罗伯特"和"辛普森一家")的定义。

我所做的是试图建立一个父母的散列将包含分散列与行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哈希。

有帮助吗?

解决方案

首先,你创建的散列从前线你分析

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;
}

其他提示

要在运行时添加一个匿名散列,将其指定为你将一个正常的哈希元素:

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

$HoH{key} = $hash_ref;

$HoH{key} = \%hash;
#!/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";
    }
}

您从一个行数据创建一个新的哈希每次,你需要考虑的唯一键的将这些数据保存在您的顶hash表。

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"}可用于获得在特定数据片。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top