Определение размера массива в Perl

Кажется, я столкнулся с несколькими различными способами нахождения размера массива. В чем разница между этими тремя методами?

my @arr = (2);
print scalar @arr; # First way to print array size

print $#arr; # Second way to print array size

my $arrSize = @arr;
print $arrSize; # Third way to print array size
Комментарии к вопросу (5)
Решение

Первый и третий способы одинаковы: они оценивают массив в скалярном контексте. Я бы считал это стандартным способом получения размера массива.

Второй способ фактически возвращает последний индекс массива, что (обычно) не совпадает с размером массива.

Комментарии (8)

Во-первых, второе не эквивалентно двум другим. $#array возвращает последний индекс массива, который на единицу меньше размера массива.

Две другие функции практически одинаковы. Вы просто используете два разных средства для создания скалярного контекста. Это сводится к вопросу читабельности.

Лично я предпочитаю следующее:

say 0+@array;          # Represent @array as a number

Я нахожу его более ясным, чем

say scalar(@array);    # Represent @array as a scalar

и

my $size = @array;
say $size;

Последнее выглядит вполне понятным само по себе, но я нахожу, что лишняя строка отнимает ясность, когда является частью другого кода. Это полезно для обучения тому, что делает @array в скалярном контексте, и, возможно, если вы хотите использовать $size более одного раза.

Комментарии (13)

Это позволяет получить размер путем принудительного перевода массива в скалярный контекст, в котором он оценивается как его размер:

print scalar @arr;

Это еще один способ принудительного перевода массива в скалярный контекст, поскольку он присваивается скалярной переменной:

my $arrSize = @arr;

Это получает индекс последнего элемента в массиве, так что на самом деле это размер минус 1 (при условии, что индексы начинаются с 0, что можно настроить в Perl, хотя обычно это плохая идея):

print $#arr;

Последний вариант не очень хорошо использовать для получения размера массива. Он будет полезен, если вы просто хотите получить последний элемент массива:

my $lastElement = $arr[$#arr];

Также, как вы можете видеть здесь, на Stack Overflow, эта конструкция не обрабатывается корректно большинством синтаксических выделителей...

Комментарии (2)

Чтобы использовать второй способ, добавить 1:

print $#arr + 1; # Second way to print array size
Комментарии (1)

Все три дают одинаковый результат, если мы модифицируем второй немного:

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;
Комментарии (1)

Пример:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
Комментарии (0)

В “типы переменных в Perl” раздел из perlintro документации содержит

специальная переменная $#массив говорит вам, что индекс последнего элемента массива:

печати $смешанная$#смешанный]; # последний элемент, отпечатки 1.23

У вас может возникнуть соблазн использовать $#массив + 1, чтобы сказать вам, сколько элементов есть в массиве. Не беспокойтесь. Как это происходит, с помощью `@массив, где на Perl ожидает найти скалярное значение (“в скалярном контексте”) даст вам количество элементов в массиве:

если (@животные < 5) { ... }

В perldata документации также рассматриваются в “скалярные величины” раздел.

Если Вам оценки массив в скалярном контексте она возвращает длину массива. (Отметим, что это не относится списки, которые возвращают последнее значение, как и оператор с запятой, ни встроенных функций, которые возвращают все, что они чувствуют, возвращаясь.) Следующий всегда истинно:

скаляр(@угодно) == $#что + 1;

некоторые программисты предпочитают использовать явное преобразование, чтобы оставить никаких сомнений:

и GT; $element_count = скаляр(@д.);

Ранее в этом же разделе Документы как получить индекс последнего элемента массива.

длина массива-это скалярная величина. Вы можете найти длину массива @дней оценки $#дней, как в КШ. Однако, это не длину массива, это индекс последнего элемента, который имеет другое значение, так как там обычно 0-ой элемент.

Комментарии (0)

Из perldoc perldata, который должен быть безопасным для цитата:

следующая всегда истинно:

скаляр(@угодно) == $#что + 1;

Просто так долго, как вы Дон'т $#что++ и таинственно увеличить размер или массива.

индексы массивов начинаются с 0.

и

вы можете обрезать массив вниз, чтобы ничего не присваивая список нуль () к нему. Следующие утверждения эквивалентны:

@все = (); и GT; $#, что = -1;

Который приносит мне к тому, что я ищу, которая заключается в том, как обнаружить массив пуст. Я нашел его, если $#пусто == -1;

Комментарии (0)

Существуют различные способы печати размер массива. Здесь представлены значения всех: Давайте предположим, что наш массив моя @Арр = (3,4);

Метод 1: скалярные

Это правильный путь, чтобы получить размер массива.

print scalar @arr;  # prints size, here 2

Способ № 2: порядковый номер `$#Арр дает последний индекс массива. так что если массив имеет размер 10, то его последний индекс будет составлять 9.

print $#arr;     # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get array size

Мы добавляем 1 здесь рассматривают массив как 0-проиндексированных. Но, если его не с нуля потом, этой логике не удастся.

perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

Выше пример печатает 6, потому что мы поставили свой первоначальный индекс 4. Теперь индекс будет 5 и 6, с элементами 3 и 4 соответственно.

Способ № 3: Когда массив используется в скалярном контексте, то она возвращает размер массива

my $size = @arr;
print $size;   # prints size, here 2

На самом деле Способ 3 и способ 1 такие же.

Комментарии (0)

Как насчет инт(@массив), как угрозы аргумент как скаляр.

Комментарии (0)

Чтобы найти размер массива использовать скаляр ключевое слово:

print scalar @array;

Чтобы узнать последний индекс массива есть $# (в Perl переменная по умолчанию). Это дает последний индекс массива. Как массив начинается с 0, мы получаем размер массива путем добавления одного к $#:

print "$#array+1";

Пример:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

Выход:

3

3
Комментарии (0)