2012-01-12 62 views
2

我有兩個哈希,具有相同的鍵和不同的值。具體而言,它們是兩個不同SNMP查詢的結果,用於恢復交換機上的MAC地址和網橋端口ID。兩者的密鑰是相同的,並且是與查詢的每一行的值一起返回的SNMP字符串。使用密鑰在Perl中加入兩個哈希?

I.e.的MAC地址散列將有一個鍵/值對下面的:

17.4.3.1.1.0.37.17.87.107.181/00 25 11 57 6B B5

鑑於網橋端口散列將具有對應的鍵/值對:

17.4.3.1.1.0.37.17.87.107.181/56

這是在哈希值中的所有條目真。

我認爲這將是拉動值從每個哈希左側的SNMP字符串,並把它們放入一個新的簡單的事情。但是,下面的代碼:

foreach $curSnmpId (@macKeys){ 
     #Keys for macAddrHash and bridgePortHash are identical, 
     #so code below should pull corresponding entries out of 
     #each and put into macBridgeHash 
     my $curMacAddr = $macAddrHash{$curSnmpId}; 
     my $curBridgeId = $bridgePortHash{$curSnmpId}; 
     print "curSnmpId: $curSnmpId curMacAddr: $curMacAddr curBridgeId: $curBridgeId\n"; 
     $macBridgeHash{$curBridgeId} = $curMacAddr; 
    } 

提供了以下的輸出:

 
curSnmpId: 17.4.3.1.1.0.37.17.87.107.181 curMacAddr: 00 25 11 57 6B B5 curBridgeId: 
curSnmpId: 17.4.3.1.1.0.0.116.250.193.119 curMacAddr: 00 00 74 FA C1 77 curBridgeId: 
curSnmpId: 17.4.3.1.1.0.35.24.202.193.125 curMacAddr: 00 23 18 CA C1 7D curBridgeId: 

我已經檢查了橋端口散得到了它的數據。我也注意到,當我在地方@macKeys的使用按鍵從橋上端口散,我得到的curBridgeId,但沒有curMacAddr。

鑑於$ curSnmpId(例如17.4.3.1.1.0.37.17.87.107.181)的值存在在這兩個哈希的關鍵,爲什麼不是我的代碼工作?我一直在Google上搜索,搜索,並在最後一天左右抨擊我的頭,並非常感謝任何幫助。

問候, tbdanny

+2

您的輸出指示在兩個散列中都不存在鍵「17.4.3.1.1.0.37.17.87.107.181」。也許其中一個鍵嵌入了空格,換行符或NULL字節? 嘗試單步執行調試程序,或使用'Data :: Dumper'檢查'\%macAddrHash'和'\%bridgePortHash'。 – mob 2012-01-13 00:12:22

回答

3

首先,你在代碼中使用use strict;use warnings;編譯指示?這將有助於檢測您通常不會看到的語法錯誤。

你也應該做一點錯誤檢查過:

foreach my $curSnmpId (sort keys %macAddrHash) { 

    # 
    # This will warn you if there's no matching key in %bridgePortHash 
    # 
    if (not exists $bridgePortHash{$curSnmpId} { 
     warn "WARNING: Nonexistant Bridge Port Data at $curSnmpId"; 
    } 
    print "curSnmpId: $curSnmpId " 
    print "curMacAddr: $macAddrHash{$curSnmpId} "; 

    # 
    # Due to `use warnings`, you'll get an error message if this is undefined 
    # 
    print "curBridgeId: $bridgePortHash{$curSnmpId}\n"; 
} 

這樣一來,你會看到警告消息,如果有橋端口的哈希值不具有相同的密鑰,以%macAddrHash。如果鍵條目存在,您會收到警告,但是當它嘗試打印出該值時,該值是未定義的。

另一件事,我建議是使用Data::Dumper剛剛打印出來的兩個散列並驗證他們有相同的一組按鍵:

use Data::Dumper; 

[...] 

print Dumper (\%macAddrHash) . "\n"; 
print Dumper (\%bridgePortHash) . "\n"; 

這將打印出兩個散列的整個結構。你必須經過它,但它會幫助你看到你的數據結構中的錯誤可能是哪裏..

另一個巧妙的驗證這樣的技巧是使用Test::More來驗證你的密鑰是相同的在這兩個哈希值:

use Test::More tests => 1; 

[...] 

is_deeply (\@{[sort keys %macAddrHash]}, \@{[sort keys %bridgePortHash]}); 

我有一種感覺,你會發現,你的數據可能不是你認爲它是。

+0

@mob - 你說得對。我一直在使用'say'來消除'\ n'問題。我會糾正這個帖子。謝謝。 – 2012-01-13 02:26:27

+0

是否有你使用'\ @ {[sort keys%macAddrHash]}'而不是'[sort keys%macAddrHash]''的原因?創建一個數組引用看起來有點多餘,解引用它並創建另一個數組ref。 – flesk 2012-01-13 06:34:54

+0

我發現如果你在散列上使用Data :: Dumper,它將打印出來作爲一個變量列表。要打印散列的結構,必須傳入對散列的引用。 – 2012-01-13 13:59:37