Как я могу использовать существующий массив в качестве значения в хэше в Perl? - PullRequest
3 голосов
/ 03 октября 2009

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

$hash{fieldName} = @myArray;

Только это, очевидно, не работает! Помощь оценена!

Ответы [ 4 ]

12 голосов
/ 03 октября 2009

Вы можете хранить только скалярные значения в хешах / массивах. Вам необходимо использовать:

$hash{fieldName} = \@myArray;

для его хранения и:

my @myOtherArray = @{$hash{fieldName}};

чтобы вернуть его. Он работает вокруг скалярного требования, используя ссылку на массив.

6 голосов
/ 03 октября 2009

И так как никто не упомянул об этом, ваш код сделал следующее:

  • , поскольку вы присваивали элементу хеша, присваивание находилось в скалярном контексте

  • в скалярном контексте значение массива становится размером массива

  • Итак, значение $hash{fieldName} стало равным размеру массива (scalar @myarray)

5 голосов
/ 03 октября 2009

Хотя правильный ответ действительно для хранения ссылки, бывают случаи, когда различия между \@myArray, [ @myArray ] (мелкая копия) и dclone (глубокая копия) имеют значение.

Если у вас есть $hash{fieldName} = \@myArray, то $hash{fieldName}->[2] изменит третий элемент @myArray. Если @myArray сам по себе не содержит ссылок, то сохранение мелкой копии поможет вам избежать такого поведения.

4 голосов
/ 03 октября 2009

Вы можете сохранить ссылку на массив, используя оператор обратной косой черты '\', например,

$hash{fieldName} = \@myArray

Вы можете использовать для доступа к нему следующее:

@{$hash{fieldName}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...