簡體   English   中英

如何在Perl中創建哈希表?

[英]How to create a Hash of Hash in perl?

我對哈希還比較陌生。 我有個問題。 我有一個文件,其中每個條目的格式

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

該文件是一個日志文件,包含大約20000個條目。

接下來,我將條目拆分為空白並將其存儲在數組中,比方說,arr。 因此arr [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

等等。 我真的需要幫助。 希望有人可以為此提供代碼。

關鍵在做

++$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");
}

創建此類HoH的最簡單方法是通過其結構參考樹,該樹會在路徑中為您創建所有當前不存在的節點:

my $hohStruct;

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

這樣,當您將根$hohStruct轉換為hash( %$hohStruct )時,它將有兩個鍵(1和2), %$hohStruct->{'1'}將有2個(A和B) %$hohStruct->{'1'}->{'A'}將具有2(I和II), %$hohStruct->{'2'}將僅具有一(2), %$hohStruct->{'2'} 。您可以循環遍歷結構類似。 與文件系統目錄樹相同。 如果樹的深度是按照約定固定的,並且知道結構,則可以編寫嵌套的for(每個)循環來展平結構。

因此,在您的情況下,我將第二個域名( www.abc.com )放在根目錄下的第一個節點中,將IP放在第二個級別中, www.abc.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM