Объединение двух хэшей в Perl с использованием ключей? - PullRequest
2 голосов
/ 13 января 2012

У меня есть два хэша с одинаковыми ключами и разными значениями.В частности, это результаты двух разных запросов SNMP для восстановления MAC-адресов и идентификаторов мостовых портов на коммутаторе.Ключи для обоих идентичны и представляют собой строку 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 Ответ

3 голосов
/ 13 января 2012

Прежде всего, вы используете 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 ::Еще чтобы убедиться, что ваши ключи одинаковы в обоих хешах:

use Test::More tests => 1;

[...]

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

У меня такое ощущение, что вы обнаружите, что ваши данные могут не соответствовать вашим ожиданиям.

...