В Perl, как я могу создать хеш-таблицу из двух массивов равной длины? - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь создать хеш из 2 разных массивов одинаковой длины.Элементами первого массива будут «ключи», а элементами второго массива будут значения.

Я попробовал следующий код: FYI: массив «vss» относится к именам виртуальных серверов,и "vsports" относится к портам tcp.

my %vsnhash;
@vsnhash {@vss} = @vsports;
print Dumper(\%vsnhash); 

Это работает для меня, пока все элементы (имена) в первом массиве уникальны.Если это не так, я не могу получить доступ ко всем значениям ключей => в хэше из-за дублированного ключа.

Как я могу создать дополнительный уникальный «уровень» или «ключ» для хэша, который я мог бы использовать для ссылки на данные с повторяющимися именами (или «ключами»)?

Любые предложения или альтернативные решения будут очень полезны.Спасибо

Ответы [ 2 ]

4 голосов
/ 11 октября 2011
for (my $i = 0; $i < @vss; $i++) {
    push (@{$vsnhash->{$vss[$i]}}, $vsports[$i]);
}

Затем получите доступ к каждому хеш-ключу в виде массива. Массив будет размером с количество ключевых ссылок. Вот несколько примеров этого: Обход структуры данных Perl - ссылка следует за ключом

1 голос
/ 13 октября 2011

Вы также можете использовать each_array из List::MoreUtils:

#!/usr/bin/env perl

use strict; use warnings;

use List::MoreUtils qw( each_array );

my @k = qw(a a b c d d e e f);
my @v = qw(1 2 3 4 5 6 7 8 9);

my %h;
my $it = each_array(@k, @v);

while (my ($k, $v) = $it->()) {
    push @{ $h{ $k } }, $v;
}

use YAML;
print Dump \%h;

Выход:

---
a:
  - 1
  - 2
b:
  - 3
c:
  - 4
d:
  - 5
  - 6
e:
  - 7
  - 8
f:
  - 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...