Синтаксис языка программирования - Perl
-Из: https://perldoc.perl.org/perldata-
Если вы оцениваете массив в скалярном контексте, он возвращает длину массива. (Обратите внимание, что это не относится к спискам, которые возвращают последнее значение, как оператор запятой C, а также к встроенным функциям, которые возвращают все, что они хотят вернуть.) Следующее всегда верно:
scalar(@whatever) == $#whatever + 1; //#1
Некоторые программисты предпочитают использовать явное преобразование, чтобы не оставлять сомнений:
$element_count = scalar(@whatever); //#2
Не понятно что имеется ввиду в инструкциях выше, объясните пожалуйста что имеется в #1 и в #2...
Ответы (1 шт):
Конструкция $#имя, где имя - это имя массива @имя возвращает индекс последнего элемента. Так как в Perl'е первый индекс нулевой, то индекс последнего элемента на единицу меньше его длины. Поэтому длина массива на единицу больше. Тут как бы все абсолютно очевидно.
Конструкцией scalar(@whatever) == $#whatever + 1; хотели сказать, что scalar(@whatever) и $#whatever + 1 равны.
scalar - это такая функция, которая, которая "форсирует" скалярный контекст. А массив в скалярном контексте возвращает как раз его длину.
Конструкцией $element_count = scalar(@whatever); просто сохранили значение длины массива в переменную. Не более.
Если Вы программировали до этого на "обычных языках программирования", то привыкли, что операнды определяют, как поведет себя операция или функция. То есть, если у нас операция +, то как оно для чисел будет сложение, для строк конкатенация. В перле же все наоборот - операция определяет, что делать. И если написано $x + $y, а $x и $y - строки, то это их проблема - они будут преобразованы в числа и сложены как числа. Для конкатенации строк есть есть точка. И если операнды вдруг не строки - это их проблема.
Уметь определять контекст - одно с важных умений Perl программиста. Иногда это бывает не так тривиально. особенно в этом плане отличается функция reverse, если ей передать строковую переменную. Она может по разному работать. Помедитируйте на досуге о том, что выведет данный код
my $x = "test";
print(reverse($x));
my $rt = reverse($x);
print ($rt);