Как назначить два массива для хэша в Perl?
У меня есть строки кода с двумя большими массивами (поэтому не могу просто записать его в хэш), который я хочу связать с хешем.
Например, $array1[0]
становится ключом, а $array2[0]
становится значением и т.д. на $array1[150]
, $array2[150]
.
Любые идеи, как я это делаю?
Ответы
Ответ 1
Вы можете сделать это в одном задании:
my %hash;
@hash{@array1} = @array2;
Это обычная идиома. Из perldoc perldata на срезах:
Если вы смущены тем, почему используете вместо этого '@' на хеш-сегменте "%", подумайте об этом так. тип кронштейна (квадратный или кудрявый) определяет, будет ли это массив или хэш. С другой hand, ведущий символ ('$' или '@') на массиве или хеше указывает, вы возвращаетесь к исключительной ценности (скаляр) или множественное число (список).
Когда я вижу один из них, я вижу ментальный образ молнии...
Ответ 2
martin clayton имеет лучший ответ для вашего общего вопроса, добавила также интересную новую функцию в Perl 5.12. Вы можете использовать каждый из массива, чтобы вы могли легко выполнять итерацию через параллельные массивы. Это полезно, когда вы хотите манипулировать значениями, прежде чем использовать их:
while( my( $index, $value ) = each @array1 ) {
...; # maybe do something to $value
$hash{ $value } = $array2[$index];
}
Ответ 3
use List::MoreUtils qw( zip );
my @a = 'A' .. 'E';
my @b = 1 .. 5;
my %hash = zip @a, @b;
Ответ 4
(Я попробовал опубликовать это как комментарий к ответу на brian, но не смог получить форматирование правильно.)
Вы должны быть осторожны, чтобы избежать вложенных применений each
. each
работает над "глобальным" итератором в массиве. Когда он достигает конца, он возвращает false, а затем сбрасывает позицию до начала. Таким образом, следующий код приводит к бесконечному циклу.
Благодаря RJBS за поговорить в YAPC:: NA, где он указал на глобальный характер встроенного итератора.
use strict;
use warnings;
my @array = 'A' .. 'J' ;
while ( my ($index, $value) = each @array){
print "printing ($index, $value) from outer loop\n";
while ( my ($index_in, $value_in) = each @array){
print "printing ($index_in, $value_in) from inner loop\n";
}
}