2013-03-22 83 views
0

我對散列比較陌生。我有個問題。我有一個文件,其中每個條目的形式如何在perl中創建散列哈希?

187.231.45.47 - - www.xyz.com 200 10567 www.abc.com. 

該文件是一個日誌文件,包含圍繞20000項。

我接下來在whitespaces上分割條目並將它存儲在一個數組中,讓我們說,arr。 所以常用3 [3] www.xyz.com和ARR [6] www.abc.com

我想了解的是,在ARR [3]有多少不同ARR的位置每一個元素[6]是否存在,相應的arr [3]的arr [6]的計數是多少。

對於例如,如果日誌文件是

187.231.45.47 - - www.xyz.com 200 10567 www.abc.com 
187.231.45.47 - - www.xyz.com 200 10567 www.ab.com 
187.231.45.47 - - www.xyz.com 200 10567 www.ab.com 
187.231.45.47 - - www.xyz.com 200 10567 www.c.com 
187.231.45.47 - - www.x.com 200 10567 www.abc.com 

的話,我應該得到的輸出 爲www.xyz.com

www.abc.com =1 
www.ab.com=2 
www.c.com=1 

爲www.x.com

www.abc.com=1 

等。我真的需要幫助。希望有人能爲此提供代碼。

+0

還有什麼可以在 - 場呢?特別是可能存在帶空格的引用字符串? – ysth 2013-03-22 21:05:26

+0

沒有先生。那些都是破折號。我猜沒什麼可擔心的。 – drastogi 2013-03-22 21:11:59

回答

1

的關鍵是做

++$counts{ $fields[3] }{ $fields[6] }; 

爲文件的每個記錄。

要生成輸出,只需使用一對嵌套for循環遍歷散列的鍵,一旦完成構建它們。

for my $foo (keys(%counts)) { 
    for my $bar (keys(%{ $counts{$foo} })) { 
     my $count = $counts{$foo}{$bar}; 
     ... 
    } 
} 

這裏的整個事情:

my %counts; 
while (<>) { 
    my @fields = split; 
    ++$counts{ $fields[3] }{ $fields[6] }; 
} 

for my $foo (keys(%counts)) { 
    print("For $foo,\n"); 
    for my $bar (keys(%{ $counts{$foo} })) { 
     my $count = $counts{$foo}{$bar}; 
     print("$bar=$count\n"); 
    } 
    print("\n"); 
} 
+0

我會盡力實現這一點。謝謝。 – drastogi 2013-03-22 21:23:28

+0

@drastogi,新增完整程序。 – ikegami 2013-03-22 22:25:28

+0

我已經執行過相同的操作。但還是非常感謝 – drastogi 2013-03-23 14:16:06

0

建立這樣一個環比的最簡單的方法是通過它的結構基準樹,爲您創建路徑中的所有節點,如果不存在,目前他們:

my $hohStruct; 

$hohStruct->{'1'}->{'A'}->{'I'} = 5; 
$hohStruct->{'1'}->{'A'}->{'II'} = 4; 
$hohStruct->{'1'}->{'B'}->{'I'} = 2; 
$hohStruct->{'2'}->{'A'}->{'I'} = 7; 

這樣的話,當你轉換根$hohStruct散列(%$hohStruct),它將具有兩個鍵,(1和2),%$hohStruct->{'1'}將具有2(A和B)%$hohStruct->{'1'}->{'A'}將有2個(I和II),%$hohStruct->{'2'}將只有一個(2)等你可以類似地循環和遍歷結構。與文件系統目錄樹相同。如果您的樹深度按照慣例固定並且您知道結構,則可以爲每個循環編寫嵌套以使結構變平。

所以你的情況,我把第二個域名(www.abc.com)的第一個節點的根目錄下,IP在第二級等

+0

'%hohStruct'是一個HoHoH。不知道爲什麼,特別是因爲你告訴他使用HoH。 – ikegami 2013-03-22 21:18:13

+0

你稱之爲具有靈活節點深度的結構(如FS目錄)是什麼?他可能比HoH有更復雜的結構來存儲其他字段 – amphibient 2013-03-22 21:24:06

+0

我認爲無論深度如何,術語HoH都適用,IOW我認爲我們不認爲我們需要反映簡單英語命名約定中結構的深度我們稱之爲事物。 – amphibient 2013-03-22 21:25:53