Как я инициализирую массив к 0?
Я попробовал это.
my @arr = ();
Но это всегда бросает меня предупреждение, "Использование неинициализированного значения". Я не знаю размера массива заранее. Я заполняю его динамично. Я думал, что вышеупомянутая часть кода, как предполагалось, инициализировала его к 0.
Как я делаю это?
Если я вас понимаю, возможно, вам не нужен массив нулей; скорее вам понадобится хэш . Хеш-ключи будут значениями в другом массиве, а хеш-значениями будут количество раз, когда значение существует в другом массиве:
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.
Что вы имеете в виду под "инициализировать массив нулем"? Массивы не содержат "ноль" - они могут содержать "ноль элементов", что то же самое, что "пустой список". Или вы можете иметь массив с одним элементом, где этот элемент - ноль: my @array = (0);
my @array = ();
должно работать просто отлично - он выделяет новый массив под названием @array
, а затем присваивает ему пустой список, ()
. Обратите внимание, что это идентично простому выражению my @array;
, поскольку начальным значением нового массива в любом случае является пустой список.
Вы уверены, что получаете ошибку именно в этой строке, а не где-то еще в коде? Убедитесь, что в вашем модуле или скрипте есть use strict; use warnings;
, и проверьте номер строки, на которой вы получаете ошибку. (Размещение здесь контекстного кода тоже может помочь)
Чтобы получить результат в вашем комментарии к вашему сообщению, это сделает это:
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);
но на самом деле вам не нужно этого делать.