我对哈希比较陌生。我有个问题。我有一个文件,其中的每个条目都是
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计数是多少。
例如,如果日志文件
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诸若此类。我真的需要这方面的帮助。希望有人能提供这方面的代码。
发布于 2013-03-23 05:12:34
关键是要做
++$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-23 05:12:11
创建这样的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),依此类推。与文件系统目录树的工作方式相同。如果您的树深度根据约定是固定的,并且您知道结构,则可以编写嵌套的for(each)循环来扁平化结构。
因此,在您的情况下,我会将第二个域名(www.abc.com)放在根目录下的第一个节点中,IP放在第二层,依此类推。
https://stackoverflow.com/questions/15579786
复制相似问题