2016-12-08 78 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

其中值是一個**陣列您需要散列**,而不是標量** **。或者,您可以附加值,而不是替換它,將值分隔爲您選擇的字符(如逗號或分號)。 – 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

相關問題