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

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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

substr $str, $index, 1;

Ответ 4

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

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

Ответ 5

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

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

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

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

my $abc = 'A string';

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

my $def = $abc[2];

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

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

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

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

$string->ch( 2 );

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