Подтвердить что ты не робот

Как назначить два массива для хэша в Perl?

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

Например, $array1[0] становится ключом, а $array2[0] становится значением и т.д. на $array1[150], $array2[150].

Любые идеи, как я это делаю?

4b9b3361

Ответ 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";
        }
}