2010-02-21 2 views
8

В Perl, как мне сделать хэш из массивов @A и @B, имеющих равное количество элементов? Цель состоит в том, чтобы каждое значение было @A в качестве ключа к значению в @B. Полученный хеш %C будет, а затем дать возможность однозначно идентифицировать элемент от @B ключ поставки от @A.Как я могу сделать хеш Perl из массива с помощью ключей и другого массива со значениями?

ответ

23

это так просто, как

my %c; 
@c{@a} = @b; 
+0

Отлично! Я забыл о разрезе, хотя я регулярно его использую. – codeholic

+0

Спасибо! Интересно, почему это не в книгах (которые я читал). – Temujin

+0

http://perldoc.perl.org/perldata.html#Slices – toolic

2

Если я правильно понял проблему правильно:

my %c; 
$c{$a[$_]} = $b[$_] for (0 .. @a-1); 
+0

мне очень нравится Perl, но иногда один может отчаиваться на языке программирования, позволяя вам получать больше символов, отличных от букв, чем буквы в исходном коде ... – Boldewyn

+2

@Boldewyn: обычно фиксируется с использованием имен реальных переменных – ysth

0

являются ключи, B являются значения хэш-C:

use strict; 
use warnings; 

my @a = 1 .. 3; 
my @b = 4 .. 6; 
my %c; 
for (0 .. $#a) { 
    $c{$a[$_]} = $b[$_] 
} 

Имейте в виду, что не должно быть каких-либо повторяющихся значений в массив A.

8
use List::MoreUtils 'mesh'; 
my %c = mesh @a, @b; 

Вот как это сделано внутри (если вы уверены, что о равном количестве элементов):

my %c = map { $a[$_] => $b[$_] } 0 .. $#a; 
+0

Приятный, у меня не было мысль об использовании карта. –

+0

или катите свои собственные: 'sub mesh {@_ [map $ _ & 1? $ _ >> 1: ($ _ >> 1) + ($ # _ >> 1), 1 .. @ _]} ' – ysth

Смежные вопросы