Найти размер массива в 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

Ответ 1

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

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

Ответ 2

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

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

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

say [email protected];          # Represent @array as a number

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

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

и

my $size = @array;
say $size;

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

Ответ 3

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

print scalar @arr;

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

my $arrSize = @arr;

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

print $#arr;

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

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

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

Ответ 4

Пример:

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

warn "Size: " . $#a;   # Size: 1. It not the size
warn "Size: " . $size; # Size: 2

Ответ 5

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

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

Ответ 6

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

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;

Ответ 7

Типы переменных Perl документация perlintro содержит

Специальная переменная $#array сообщает вам индекс последнего элемента массива:

print $mixed[$#mixed];       # last element, prints 1.23

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

if (@animals < 5) { ... }

Документация perldata также охватывает это в разделе "Scalar values" .

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

scalar(@whatever) == $#whatever + 1;

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

$element_count = scalar(@whatever);

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

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

Ответ 8

Из perldoc perldata, который следует с уверенностью сказать:

Всегда верно следующее:

scalar(@whatever) == $#whatever + 1;

Просто до тех пор, пока вы не $# ничем и не загадочно увеличиваете размер или ваш массив.

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

и

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

    @whatever = ();
    $#whatever = -1;

Что приводит меня к тому, что я искал, а именно, как определить массив пустым. Я нашел его, если $# empty == -1;

Ответ 9

Существуют различные способы печати размера массива. Вот значения всех: Допустим, наш массив my @arr = (3,4);

Способ 1: скаляр

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

print scalar @arr;  # prints size, here 2

Метод 2: индексный номер

$#arr дает последний индекс массива. поэтому, если массив имеет размер 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-indexed. Но, если на нем не лежит ноль, , эта логика завершится неудачно.

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 одинаковы.

Ответ 10

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

print scalar @array;

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

print "$#array+1";

Пример:

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

Вывод:

3

3