Редактировать: хэш против массива
Как правильно указал cincodenada в комментарии, ysth дал лучший ответ: я должен был ответить на ваш вопрос другим вопросом: «Вы действительно хотите использовать массив Perl?
Массив выделяет память для всех возможных индексов вплоть до самого большого используемого до сих пор. В вашем примере вы выделяете 24 ячейки (но используете только 3). Напротив, хеш выделяет пространство только для тех полей, которые фактически используются.
Массив: скалярная grep
Вот два возможных решения (см. Объяснение ниже):
print scalar(grep {defined $_} @a), "\n"; # prints 3
print scalar(grep $_, @a), "\n"; # prints 3
Объяснение: После добавления $a[23]
ваш массив действительно содержит 24 элемента - но большинство из них не определены (что также оценивается как ложное). Вы можете подсчитать количество определенных элементов (как в первом решении) или количество истинных элементов (второе решение).
В чем разница? Если вы установите $a[10]=0
, то первое решение будет считать его, но второе решение не будет (потому что 0 ложно, но определено). Если вы установите $a[3]=undef
, ни одно из решений не будет учитываться.
Хеш-решение (по yst)
Как предлагает другое решение, вы можете работать с хешем и избежать всех проблем:
$a{0} = 1;
$a{5} = 2;
$a{23} = 3;
print scalar(keys %a), "\n"; # prints 3
Это решение подсчитывает нули и неопределенные значения.