Почему Perl не поддерживает нормальное [] оператор для индексации строки?

Это - просто соглашение, что означает "тип". Это не означает ничего специального для компилятора.

11
задан Peter Mortensen 15 October 2017 в 16:13
поделиться

7 ответов

Мне нравятся все ответы на данный момент, но настоящий ответ таков: «потому что Ларри этого хочет». В самом деле. Ларри придумал набор идиом и инструментов, которые работали на него, и поделился ими с нами в форме Perl. Если вы думаете не так, как думает Ларри, то есть множество других инструментов. Нам не нужен весь мир, использующий Perl ... только люди, которые «понимают», как это делает Ларри.

45
ответ дан 3 December 2019 в 00:37
поделиться

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

23
ответ дан 3 December 2019 в 00:37
поделиться

Perl имеет способ индексировать строку с помощью index или substr . Поддерживает операцию. То, что он делает это с другим синтаксисом, не имеет значения. Есть причина, по которой у нас есть более одного языка программирования. :)

Я бы не сказал, что [] - «нормальный» оператор. Я уверен, что люди могут перечислить много языков, которые этого не делают.

12
ответ дан 3 December 2019 в 00:37
поделиться

Если вы действительно хотите рассматривать скаляры как объекты, вы можете использовать autobox .

Я не использую autobox , но это должно работать:

my $indexed = ('foo'->list)[1];

autobox имеет ловушки для определения объектов, используемых для упаковки различных типов данных.

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

my $indexed = 'foo'->[3];

Итак, я думаю ответ на ваш вопрос: «Почему Perl не имеет синтаксиса [] для индексации строк?» это «Никто не хотел этого достаточно для его реализации».

Что касается Perl 6, я недостаточно внимательно следил, чтобы дать ответ, кроме

9
ответ дан 3 December 2019 в 00:37
поделиться

В Perl строки являются скалярами и, следовательно, по умолчанию не индексируются. Вы можете использовать такие функции, как substr () или index () для доступа к определенным символам в строке.

Если Perl 6 не нарушит эту концепцию, заменив строки на массив символов, я не думаю, что в этом будут какие-либо изменения.

7
ответ дан 3 December 2019 в 00:37
поделиться

Иногда бывает довольно сложно выбрать элемент интерфейса, который погребен в глубоко вложенной иерархии других элементов (например, ячейка в столбце таблицы в табличном представлении в режиме прокрутки в представлении содержимого окна).

Нажатие клавиши Shift при щелчке правой кнопкой мыши по представлению отображает хорошо отсортированную стопку элементов для выбора.

substr $str, $index, 1;
18
ответ дан 3 December 2019 в 00:37
поделиться

Как называется строка? Это скаляр, поэтому сигил, очевидно, будет $ . Остальная часть соответствует стандартным стандартам именования переменных; скажем $ abc .

my $abc = 'A string';

Поскольку сигилы означают контекст выражения и не являются частью имени, у нас есть коллизия.

my $def = $abc[2];

- это не третья буква скаляра $ abc , а третий элемент из массива, имеющий один и тот же символ (но с другим сигилом ): @abc .

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

Конечно, как указывает ответ Брэда , это может иметь значение только в том случае, если мы сделаем неявные предположения относительно того, что делает часть строки «элементом» в «списке». Чем больше кодировок вы должны использовать, тем хуже эти предположения по умолчанию работают.

Вы можете найти синтаксис, который вам больше нравится, используя autobox :

$string->ch( 2 );

(Вам придется написать ch самостоятельно.) Но это обязательно более подробно, чем просто поставить скобки на струны.

7
ответ дан 3 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: