[英]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.