Во-первых:
my @arr;
$arr{1} = 1;
$arr{2} = 2;
$arr{3} = 3;
нонсенс. {}
для хеш-ключей, поэтому вы имеете в виду %arr
не @arr
. use strict;
и use warnings;
сказали бы вам об этом, и это всего лишь один крошечный фрагмент, почему они считаются обязательными.
Чтобы подсчитать элементы в массиве, просто обращайтесь к нему в скалярном контексте.
print scalar @arr;
if ($num_elements < @arr) { do_something(); }
Но вы должны изменить свою вещь
my @arr;
$arr[1] = 1;
$arr[2] = 2;
$arr[3] = 3;
И примечание - первый элемент вашего массива $arr[0]
будет неопределенным.
$VAR1 = [
undef,
1,
2,
3
];
В результате, вы получите результат 4. Чтобы получить желаемое «количество элементов» вы должны отфильтровать неопределенные элементы, с чем-то вроде grep
:
print scalar grep {defined} @arr;
Этот возьмет @arr
с фильтром grep
(возвращается 3 элемента), а затем возьмет скалярное значение - количество элементов, в этом случае 3.
Но обычно - вы не сделали бы этого. Это необходимо только потому, что вы пытаетесь вставить значения в определенные «слоты» в вашем массиве.
Что бы вы сделали, чаще всего, является использование либо прямое назначение:
my @arr = (1, 2, 3);
Или:
push (@arr, 1);
push (@arr, 2);
push (@arr, 3);
, который вставляет значения в конец массива.Вы бы - если явно итерация - перейти от 0..$#arr
но вы редко должны сделать это, когда вы можете сделать:
foreach my $element (@arr) {
print $element,"\n";
}
Или вы можете сделать это с помощью хэш:
my %arr;
$arr{1} = 1;
$arr{2} = 2;
$arr{3} = 3;
Это превращает ваш массив в множество пар (неупорядоченный) ключ-значение, которые вы можете получить доступ с keys %arr
и сделать точно такой же:
print scalar keys %arr;
if ($elements < keys %arr) { do_something(); }
В этом последнем случае, ваш хэш будет:
$VAR1 = {
'1' => 1,
'3' => 3,
'2' => 2
};
Я бы предположил, что это плохая практика - если вы заказали значения, инструментом для задания является массив. Если у вас есть «ключевые» значения, хэш, вероятно, является инструментом для задания - например, «идентификатор запроса» или аналогичный. Обычно вы можете сказать разницу, глядя на то, как вы получаете доступ к данным, и есть ли пробелы (в том числе от нуля).
Так, чтобы ответить на ваш вопрос, как спросил:
my $size = @arr;
print $size; # prints 0
print scalar @arr; # prints 0
Они не работают, потому что вы никогда не вставляйте какие-либо значения в @arr
. Но у вас есть хэш, называемый %arr
, который вы создали неявно. (И снова - use strict;
и use warnings;
сказали бы вам это).
И если вы используете '$ arr [1] = 1;'. и т.д? * Всегда * 'использовать строгий; использовать предупреждения; '! – Biffen
Хороший пункт о строгом и предупреждениях. Я все еще хотел бы задать вопрос, как я могу получить результат подсчета, когда объявляется с помощью '{}' вместо '[]'? –
Что послужило для вас строгим и предупреждающим? Что-то о недостающем '% arr', возможно? '$ arr {1}' изменяет '% arr', а не' @ arr'. Вам придется придерживаться синтаксиса Perl. – Biffen