我将尝试用一个例子来说明这一点。举一个Hash of Hashes的常见例子:
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已经阅读过)似乎都展示了所有子黑客(例如“flintstones”,“jetsons”和“simpsons”)的定义。
我正在做的是尝试构建一个父Hash,它将包含带有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哈希。
答案 0 :(得分:3)
要在运行时添加匿名哈希,请将其分配为普通哈希元素:
$HoH{key} = { foo => 42 };
或
$HoH{key} = $hash_ref;
或
$HoH{key} = \%hash;
答案 1 :(得分: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;
}
答案 2 :(得分: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";
}
}
答案 3 :(得分: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"}
可用于获取特定数据。