如何在脚本执行期间创建匿名哈希并将哈希添加到已知哈希中?
问题描述:
我会试着用一个例子来说明这一点。以散列的散列的一个常见的例子:如何在脚本执行期间创建匿名哈希并将哈希添加到已知哈希中?
my %HoH = (
flintstones => {
lead => "fred",
pal => "barney",
},
jetsons => {
lead => "george",
wife => "jane",
"his boy" => "elroy",
},
simpsons => {
lead => "homer",
wife => "marge",
kid => "bart",
},
);
对于我而言,我希望能够一个无名,或匿名散列添加到%斛。我不需要(或能够)在运行时定义这些子哈希。我怎样才能用Perl来完成这个任务?
一切我读过(我已经通过perldocs文档和Google'd已读)似乎表明,所有子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";
}
}
答
每次,你需要考虑的唯一密钥存储在您的顶级哈希表中的数据。
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"}
可用于获取特定数据片段。
顺便说一句,你确定要为这个结构使用HoH吗?由于你解析CSV文件,这听起来像是一个数组散列可能更合适。一般来说,如果你发现自己在一个散列键或变量名的末尾粘贴了连续的数字,你应该使用一个数组。 – friedo 2009-10-29 17:01:26
我的最终目标是获得具有唯一数据的行列表(由连续3个单元格的组合确定);但是,我需要唯一行的所有单元格。也许一组哈希函数会更适合这个任务? – Mick 2009-10-29 17:33:02
你已经有很多答案了,但是我没有看到任何人将你指向数据结构食谱(perldoc perldsc)http://perldoc.perl.org/perldsc.html它具有很多用于处理复杂的数据结构。当然,你可能已经看过它,因为你已经读了一些perldoc。 – daotoad 2009-10-29 18:22:07