2009-10-29 64 views
0

我会试着用一个例子来说明这一点。以散列的散列的一个常见的例子:如何在脚本执行期间创建匿名哈希并将哈希添加到已知哈希中?

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哈希包裹我的头。

+2

顺便说一句,你确定要为这个结构使用HoH吗?由于你解析CSV文件,这听起来像是一个数组散列可能更合适。一般来说,如果你发现自己在一个散列键或变量名的末尾粘贴了连续的数字,你应该使用一个数组。 – friedo 2009-10-29 17:01:26

+0

我的最终目标是获得具有唯一数据的行列表(由连续3个单元格的组合确定);但是,我需要唯一行的所有单元格。也许一组哈希函数会更适合这个任务? – Mick 2009-10-29 17:33:02

+0

你已经有很多答案了,但是我没有看到任何人将你指向数据结构食谱(perldoc perldsc)http://perldoc.perl.org/perldsc.html它具有很多用于处理复杂的数据结构。当然,你可能已经看过它,因为你已经读了一些perldoc。 – daotoad 2009-10-29 18:22:07

回答

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

我的问题是,我不知道我需要多少%lineHash,因为它与运行时读取的CSV数量相关。 – Mick 2009-10-29 16:59:08

+1

那么问题是什么?您可以说'$ topHash {“line $ line”} = $ lineHashRef'并在您每次从CSV文件中的一行创建匿名散列时继续增加'$ line'。 – mob 2009-10-29 17:09:02

3

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

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

$HoH{key} = $hash_ref; 
你从一个行数据创建一个新的哈希

$HoH{key} = \%hash; 
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"; 
    } 
} 
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"}可用于获取特定数据片段。