我有两个哈希,具有相同的键和不同的值。具体来说,它们是两个不同SNMP查询的结果,用于恢复交换机上的MAC地址和桥接端口ID。两者的密钥相同,并且返回的SNMP字符串以及查询的每一行的值。
即。 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)的值作为两个哈希中的键存在,为什么我的代码不起作用?在最后一天左右,我一直在谷歌搜索,搜索和敲击我的头,并且非常感谢任何帮助。
此致 tbdanny
答案 0 :(得分:3)
首先,您是否在代码中使用了use strict;
和use warnings;
个pragma?这将有助于检测您通常不会看到的语法错误。
你也应该做一些错误检查:
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";
}
这样,如果Bridge Port哈希没有与%macAddrHash中相同的密钥,您将看到WARNING消息。如果键条目存在,您将收到警告,但在尝试打印该值时,该值未定义。
我建议的另一件事是使用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]});
我觉得你会发现你的数据可能不是你想象的那样。