使用密钥在Perl中加入两个哈希?

时间:2012-01-12 23:44:55

标签: perl hash merge key

我有两个哈希,具有相同的键和不同的值。具体来说,它们是两个不同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

1 个答案:

答案 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]});

我觉得你会发现你的数据可能不是你想象的那样。