0

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

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

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

4

2 回答 2

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");
}
于 2013-03-22T21:12:34.260 回答
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(等等。您可以类似地循环和遍历结构。与文件系统目录树相同。如果您的树深度按照惯例是固定的并且您知道结构,则可以编写嵌套的 for(each) 循环来展平结构。%$hohStruct->{'1'}%$hohStruct->{'1'}->{'A'}%$hohStruct->{'2'}

因此,在您的情况下,我会将第二个域名 ( www.abc.com) 放在根目录下的第一个节点中,将 IP 放在第二级等。

于 2013-03-22T21:12:10.577 回答