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

Как я инициализирую массив к 0?

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

my @arr = ();

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

Как я делаю это?

25
задан Peter Mortensen 30 September 2015 в 11:33
поделиться

3 ответа

Если я вас понимаю, возможно, вам не нужен массив нулей; скорее вам понадобится хэш . Хеш-ключи будут значениями в другом массиве, а хеш-значениями будут количество раз, когда значение существует в другом массиве:

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.
52
ответ дан 28 November 2019 в 18:02
поделиться

Что вы имеете в виду под "инициализировать массив нулем"? Массивы не содержат "ноль" - они могут содержать "ноль элементов", что то же самое, что "пустой список". Или вы можете иметь массив с одним элементом, где этот элемент - ноль: my @array = (0);

my @array = (); должно работать просто отлично - он выделяет новый массив под названием @array, а затем присваивает ему пустой список, (). Обратите внимание, что это идентично простому выражению my @array;, поскольку начальным значением нового массива в любом случае является пустой список.

Вы уверены, что получаете ошибку именно в этой строке, а не где-то еще в коде? Убедитесь, что в вашем модуле или скрипте есть use strict; use warnings;, и проверьте номер строки, на которой вы получаете ошибку. (Размещение здесь контекстного кода тоже может помочь)

.
18
ответ дан 28 November 2019 в 18:02
поделиться

Чтобы получить результат в вашем комментарии к вашему сообщению, это сделает это:

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

4
ответ дан 28 November 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: