2012-01-12 13 views
2

私は同じキーと異なる値で2つのハッシュを持っています。具体的には、スイッチ上のMACアドレスとブリッジポートIDを回復する2つの異なるSNMPクエリーの結果です。両方のキーは同一で、クエリの各行の値とともに返されるSNMP文字列です。Perlでキーを使用して2つのハッシュに参加しますか?

I.e.ブリッジポートのハッシュが対応する必要があります一方

17.4.3.1.1.0.37.17.87.107.181/00 25 11 57 6B B5

:MACアドレスハッシュは、次のキー/値のペアを持つことになりますキー/値ペア:

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など)がキーとして存在する場合、なぜ私のコードは機能しませんか?私はグーグルでこれまでの間、頭を捜して、頭を叩いてしまいました。そして、本当に助けに感謝します。

よろしく、 すべての

+2

あなたの出力は、キー '17.4.3.1.1.0.37.17.87.107.181'が両方のハッシュに存在しないことを示します。キーの1つにスペース、改行、またはNULLバイトが埋め込まれている可能性がありますか? デバッガを使用してステップ実行するか、 'Data :: Dumper'を使用して' \%macAddrHash'と '\%bridgePortHash'を調べてください。 – mob

答えて

3

まずtbdanny、あなたのコードでuse strict;use warnings;プラグマを使用していますか?これは、通常は見られない構文エラーを検出するのに役立ちます。

あなたは、あまりにもエラーチェックのビット行う必要があります:ブリッジポートのハッシュは%macAddrHashと同じキーが持っていない場合

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"; 
} 

この方法は、警告メッセージが表示されます。キーエントリが存在する場合は警告が表示されますが、値を出力しようとすると値は未定義です。私がお勧めしたい

もう一つは、ちょうど2つのハッシュをプリントアウトし、それらがキーの同じセットを持っていないことを確認するためにData::Dumperを使用することです:

use Data::Dumper; 

[...] 

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

これは、両方のハッシュの構造全体を印刷します。

このようなことを確認するもう1つのトリックは、Test::Moreを使用してキーが同じであることを確認することです両方のハッシュで:

use Test::More tests => 1; 

[...] 

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

あなたのデータはあなたの考えではないかもしれないと感じています。

+0

@mob - そうです。私は 'say'を使って' \ n'問題を取り除いています。投稿を修正します。ありがとう。 –

+0

'[sort keys%macAddrHash]'の代わりに '\ @ {[sort keys%macAddrHash]}'を使う理由はありますか?配列refを作成し、逆参照して別の配列refを作成するのは少し冗長に思えます。 – flesk

+0

Data :: Dumperをハッシュで使用すると、変数のリストとして出力されることがわかりました。ハッシュの構造を表示するには、ハッシュへの参照を渡す必要があります。 –

関連する問題