Инициализация массива в Perl - PullRequest
24 голосов
/ 15 июля 2010

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

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

my @arr = ();

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

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

Ответы [ 3 ]

51 голосов
/ 15 июля 2010

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

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.
18 голосов
/ 15 июля 2010

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

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

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

3 голосов
/ 15 июля 2010

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

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

Это отличается от вашего заявленного алгоритма создания параллелимассив с нулевыми значениями, но это более Perly способ сделать это ...

Если вам нужен параллельный массив того же размера, что и ваш первый массив с элементами, инициализированными в 0, этот оператор будетдинамически делать это: @array=(0) x scalar(@other_array); но на самом деле вам не нужно это делать.

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