Правка: хэш против массива
Как правильно указал 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
Это решение подсчитывает нули и значения undef.
person
Yaakov Belch
schedule
14.05.2009