2016-12-08 20 views
0

私はソースと宛先IPアドレスを持つ解析する必要のあるログを持っています。 ログを繰り返し処理する際に、ソースIPと宛先IPを値のペアとして保存したいと思います。PERLで多対多の関係をコーディングする方法は?

ハッシュを試しましたが、動作しませんでした。ここでは、問題の一例です:ハッシュは一意のキーを必要とするため

%sessionIPs =(); 

$sessionIPs{"1.1.1.1"} = "2.2.2.2"; 
$sessionIPs{"1.1.1.2"} = "3.3.3.3"; 
$sessionIPs{"1.1.1.3"} = "4.4.4.4"; 
$sessionIPs{"1.1.1.1"} = "5.5.5.5"; 
$sessionIPs{"3.3.3.3"} = "6.6.6.6"; 

foreach my $key (keys %sessionIPs) 
{ 
     print "key: $key, value: $sessionIPs{$key}\n"; 
} 

#prints 
key: 1.1.1.3, value: 4.4.4.4 
key: 1.1.1.2, value: 3.3.3.3 
key: 1.1.1.1, value: 5.5.5.5 
key: 3.3.3.3, value: 6.6.6.6 

あなたが言うことができるように、私は1.1.1.1のソースIPおよび2.2.2.2、宛先IPキー/値のペアを失いました。重複するキーを禁止しないハッシュや他のタイプのオブジェクトが必要です。

この種の関連データをperlのどのオブジェクトに保存させることができますか?

+0

あなたは**スカラ、**値は**配列であるハッシュをする必要はないでしょう**。あるいは、値を置き換えるのではなく、その値で指定されたIPをコンマやセミコロンなどの選択した文字で区切って、値を置き換えるのではなく、追加することもできます。 – AntonH

+0

データ構造の設計は、データの構造を想像するのではなく、あなたが求めている質問*に関するものです。これらの送信元アドレスと送信先アドレスは、常に区別されているのか、またはほとんど対称な関係になっていますか? (宛先もソースとすることはできますか?)任意のアドレスについて知りたい情報はありますか?たとえば、発信接続の数、発信元か宛先かなど、指定された発信元と宛先のペアが一定期間内に何回接続されたかなど。 – Borodin

+0

実際には1:N(各キーには多数の値があります) )であり、N:Nではない。したがって、配列のハッシュが行います。 – ikegami

答えて

3

あなたは正しい軌道に乗っています。私はハッシュが良い方法だと思います。もちろん

%sessionIPs = {}; 
@{$sessionIPs{"1.1.1.1"}} = ("2.2.2.2", "5.5.5.5"); 
... 

、あなたはおそらく、あなたが押すことができるように、プログラム的に宛先を追加したいと思う:しかし、むしろハッシュでスカラー(単一の値)を格納するよりも、あなたはハッシュ内の値の配列を格納することができ新しい値:

push @{$sessionIPs{"1.1.1.1"}}, "6.6.6.6"; 

または、より一般的に:

push @{$sessionIPs{$source}}, $destination; 

完全な例:

%sessionIPs =(); 

push @{ $sessionIPs{"1.1.1.1"}}, "2.2.2.2"; 
push @{ $sessionIPs{"1.1.1.1"}}, "3.3.3.3"; 
push @{ $sessionIPs{"1.1.1.1"}}, "4.4.4.4"; 
push @{ $sessionIPs{"5.5.5.5"}}, "6.6.6.6"; 
push @{ $sessionIPs{"5.5.5.5"}}, "7.7.7.7"; 

foreach my $source (keys %sessionIPs) { 
     print "source: $source\n"; 
     foreach my $dest (@{$sessionIPs{$source}}) { 
       print " dest: $dest\n"; 
     } 
} 

出力を提供します。

source: 1.1.1.1 
    dest: 2.2.2.2 
    dest: 3.3.3.3 
    dest: 4.4.4.4 
source: 5.5.5.5 
    dest: 6.6.6.6 
    dest: 7.7.7.7 
+1

私はそれを '$ sessionIPs {" 1.1.1.1 "} = [" 2.2.2.2 "、" 5.5.5.5 "];と書くと思います。 – Sobrique

+0

@KRichardsonこれは、上記のコメントで他の人が話していた解決策のようですが、試してみました。どうもありがとう。小さなお菓子のSobriqueにも感謝します。私はKRichardsonsの解決策を理解しましたが、あなたの記事を読んだ後ではさらに明確でした。 – scryptKiddy

+0

定義された値の配列のハッシュを検索することに成功していません。ここではサンプルの質問です。"どのソースIPに宛先IPがx.x.x.xであるか"。だから私はハッシュ内の配列を照会する必要があり、私はどのようにそれを開始するのかよく分からないので、私はコードがありません。私もこれについて新しい質問をするべきですか? – scryptKiddy