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)に変換すると、2つのキー(1と2)、%$hohStruct->{'1'}2(AとB)%$hohStruct->{'1'}->{'A'}、2(IとII)、 %$hohStruct->{'2'}1つだけ(2)になります。など。同様に、構造をループしてトラバースできます。ファイルシステムディレクトリツリーと同じように機能します。ツリーの深さが慣例により固定されており、構造がわかっている場合は、ネストされたfor(each)ループを記述して構造を平坦化できます。

したがって、あなたの場合、www.abc.comルートの下の最初のノードに2番目のドメイン名()を配置し、2番目のレベルにIPを配置します。

于 2013-03-22T21:12:10.577 に答える