如何在perl中创建哈希哈希?

时间:2013-03-22 21:02:05

标签: perl hash

我对哈希相对较新。我有个问题。我有一个文件,其中每个条目的格式为

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

等等。我真的需要帮助。希望有人能为此提供代码。

2 个答案:

答案 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等等。