我对哈希相对较新。我有个问题。我有一个文件,其中每个条目的格式为
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
等等。我真的需要帮助。希望有人能为此提供代码。
答案 0 :(得分: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");
}
答案 1 :(得分:0)
创建这样一个HoH的最简单方法是通过它的结构引用树,如果它们目前不存在,它会在路径中为你创建所有节点:
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等等。