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