Инициализация массива в Perl
Как инициализировать массив до 0?
Я пробовал это.
my @arr = ();
Но он всегда бросает мне предупреждение "Использование неинициализированной ценности". Я заранее не знаю размер массива. Я заполняю его динамически. Я думал, что вышеуказанный фрагмент кода должен был инициализировать его до 0.
Как это сделать?
Ответы
Ответ 1
Если я понимаю вас, возможно, вам не нужен массив нулей; скорее, вам нужен хеш. Хеш-ключи будут значениями в другом массиве, а хэш-значения будут количеством раз, когда это значение существует в другом массиве:
use strict;
use warnings;
my @other_array = (0,0,0,1,2,2,3,3,3,4);
my %tallies;
$tallies{$_} ++ for @other_array;
print "$_ => $tallies{$_}\n" for sort {$a <=> $b} keys %tallies;
Вывод:
0 => 3
1 => 1
2 => 2
3 => 3
4 => 1
Чтобы более точно ответить на ваш конкретный вопрос, чтобы создать массив, заполненный связкой нулей, вы можете использовать технику в этих двух примерах:
my @zeroes = (0) x 5; # (0,0,0,0,0)
my @zeroes = (0) x @other_array; # A zero for each item in @other_array.
# This works because in scalar context
# an array evaluates to its size.
Ответ 2
Что вы подразумеваете под "инициализацией массива до нуля"? Массивы не содержат "нуль" - они могут содержать "нулевые элементы", что совпадает с "пустым списком". Или у вас может быть массив с одним элементом, где этот элемент равен нулю: my @array = (0);
my @array = ();
должен работать просто отлично - он выделяет новый массив с именем @array
, а затем присваивает ему пустой список ()
. Обратите внимание, что это то же самое, что просто сказать my @array;
, так как исходное значение нового массива все равно пустое.
Вы уверены, что получаете ошибку из этой строки, а не где-то еще в своем коде? Убедитесь, что у вас есть use strict; use warnings;
в вашем модуле или script, и проверьте номер строки полученной вами ошибки. (Здесь может также помочь публикация некоторых контекстных кодов.)
Ответ 3
Чтобы вывести вывод в свой комментарий к сообщению, это сделает следующее:
use strict;
use warnings;
my @other_array = (0,0,0,1,2,2,3,3,3,4);
my @array;
my %uniqs;
$uniqs{$_}++ for @other_array;
foreach (keys %uniqs) { $array[$_]=$uniqs{$_} }
print "array[$_] = $array[$_]\n" for (0..$#array);
Вывод:
array[0] = 3
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 1
Это отличается от вашего заявленного алгоритма создания параллельного массива с нулевыми значениями, но это более простой способ сделать это...
Если у вас должен быть параллельный массив такого же размера, как ваш первый массив с элементами, инициализированными 0, этот оператор будет динамически делать это: @array=(0) x scalar(@other_array);
, но на самом деле вам не нужно это делать.