Почему Perl не поддерживает обычный оператор [] для индексации строки? - PullRequest
11 голосов
/ 02 ноября 2009

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

Почти все основные языки программирования поддерживают этот оператор, особенно два других «P»: Python и PHP. Более того, я думаю, что реализовать этот маленький синтаксис должно быть легко. Кроме того, в соответствии с философией языка программирования Perl - настолько ленивой, насколько мы могли, так почему же мы пытаемся использовать функцию для индексации строки?

Будет ли Perl 6 поддерживать этот синтаксис?

Ответы [ 7 ]

45 голосов
/ 02 ноября 2009

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

23 голосов
/ 02 ноября 2009

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

18 голосов
/ 02 ноября 2009

Хотите индексировать байтами, символами или графемами?

Вот почему в Perl 6 length "забанен" , вместо этого вы используете одно из следующего:

  • bytes
    Точно один байт за раз
  • chars
    В зависимости от исходного текста это может быть один байт или несколько байтов.
  • graphs
    Это похоже на символы, но объединяет несколько «комбинирующих» символов вместе.

Если вы действительно этого хотите, вы можете сделать что-то подобное, используя split.

( split '', $str )[$index];

Вероятно, лучше просто использовать substr.

substr $str, $index, 1;
12 голосов
/ 02 ноября 2009

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

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

9 голосов
/ 02 ноября 2009

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

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

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

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

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

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

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

Что касается Perl 6, я недостаточно внимательно следил за ответом: «Если его нет и вы действительно этого хотите, вы сможете добавить его самостоятельно».

7 голосов
/ 02 ноября 2009

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

my $abc = 'A string';

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

my $def = $abc[2];

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

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

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

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

$string->ch( 2 );

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

7 голосов
/ 02 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...