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

Инициализация массива в Perl

Как инициализировать массив до 0?

Я пробовал это.

my @arr = ();

Но он всегда бросает мне предупреждение "Использование неинициализированной ценности". Я заранее не знаю размер массива. Я заполняю его динамически. Я думал, что вышеуказанный фрагмент кода должен был инициализировать его до 0.

Как это сделать?

4b9b3361

Ответ 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);, но на самом деле вам не нужно это делать.