2009-10-29 80 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"}可用於獲取特定數據片段。