gpt4 book ai didi

perl - 使用键在 Perl 中加入两个散列?

转载 作者:行者123 更新时间:2023-12-04 06:01:38 27 4
gpt4 key购买 nike

我有两个散列,具有相同的键和不同的值。具体来说,它们是两个不同的 SNMP 查询的结果,用于恢复交换机上的 MAC 地址和桥接端口 ID。两者的键是相同的,并且是与查询的每一行的值一起返回的 SNMP 字符串。

IE。 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:

我已经检查过桥端口哈希是否有数据。我还注意到,当我使用桥端口哈希中的 key 集代替 @macKeys 时,我得到了 curBridgeId,但没有 curMacAddr。

鉴于 $curSnmpId 的值(例如 17.4.3.1.1.0.37.17.87.107.181)作为键存在于两个散列中,为什么我的代码不起作用?在最后一天左右的时间里,我一直在谷歌搜索,搜索和敲打我的头,并且非常感谢任何帮助。

问候,
tbdanny

最佳答案

首先,你用的是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验证您的 key 在两个哈希中是否相同:
use Test::More tests => 1;

[...]

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

我有一种感觉,您会发现您的数据可能不是您认为的那样。

关于perl - 使用键在 Perl 中加入两个散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844018/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com