首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在perl中创建Hash of Hash?

如何在perl中创建Hash of Hash?
EN

Stack Overflow用户
提问于 2013-03-23 05:02:05
回答 2查看 93关注 0票数 0

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

代码语言:javascript
复制
187.231.45.47 - - www.xyz.com 200 10567 www.abc.com. 

该文件是一个日志文件,包含大约20000个条目。

接下来,我拆分空格上的条目,并将其存储在一个数组中,比如说arr。所以arr3是www.xyz.com,arr6是www.abc.com

我想知道的是,对于arr3位置中的每个元素,存在多少个不同的arr6,以及相应arr3的arr6计数是多少。

例如,如果日志文件

代码语言:javascript
复制
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的输出

代码语言:javascript
复制
www.abc.com =1
www.ab.com=2
www.c.com=1

对于www.x.com

代码语言:javascript
复制
www.abc.com=1

诸若此类。我真的需要这方面的帮助。希望有人能提供这方面的代码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-23 05:12:34

关键是要做

代码语言:javascript
复制
++$counts{ $fields[3] }{ $fields[6] };

对于文件的每条记录。

要生成输出,只需使用一对嵌套的for循环在构建完散列后遍历散列的键。

代码语言:javascript
复制
for my $foo (keys(%counts)) {
   for my $bar (keys(%{ $counts{$foo} })) {
      my $count = $counts{$foo}{$bar};
      ...
   }
}

整个过程是这样的:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-03-23 05:12:11

创建这样的HoH最简单的方法是通过它的结构引用树,如果当前不存在所有节点,它会为您创建路径中的所有节点:

代码语言:javascript
复制
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),依此类推。与文件系统目录树的工作方式相同。如果您的树深度根据约定是固定的,并且您知道结构,则可以编写嵌套的for(each)循环来扁平化结构。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15579786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档