В чем секрет того, что Perl делает так мало кода? - PullRequest
13 голосов
/ 11 апреля 2010

Я видел много Perl-программ (code-golf), и даже если я не могу их прочитать (не знаю Perl), я удивляюсь, как вам удается получить такой маленький кусочек кода, чтобы делать займет 20 строк на каком-то другом языке программирования.

  • В чем секрет Perl? Существует ли специальный синтаксис, который позволяет вам выполнять сложные задачи в несколько нажатий клавиш? Это смесь регулярных выражений?

Я бы хотел научиться писать мощные и в то же время короткие программы, подобные тем, которые вы знаете из испытаний кода-гольфа здесь. Что было бы лучшим местом для начала? Я не хочу изучать "чистый" Perl - Я хочу писать сценарии, даже если я больше не понимаю после недели .

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

Ответы [ 7 ]

32 голосов
/ 11 апреля 2010

Есть ряд факторов, которые делают Perl хорошим для игры в гольф кода:

  • Нет ввода данных. Значения могут использоваться взаимозаменяемо как строки и числа.
  • "Диагональный" синтаксис. Обычно упоминается как TMTOWTDI (есть несколько способов сделать это.)
  • Переменные по умолчанию. Большинство функций действуют на $_, если не указан аргумент. (Несколько акт на @_.)
  • Функции, которые принимают несколько аргументов (например, split), часто имеют значения по умолчанию, которые позвольте вам опустить некоторые аргументы или даже все из них.
  • «Волшебный» оператор readline, <>.
  • Функции высшего порядка, такие как map и grep
  • Регулярные выражения интегрированы в синтаксис (т.е. не в отдельную библиотеку)
  • Операторы короткого замыкания возвращают последнее проверенное значение.
  • Операторы короткого замыкания могут использоваться для управления потоком.

Дополнительно, без ограничений (которые по умолчанию выключены):

  • Вам не нужно объявлять переменные.
  • Автоматическая кавычка слов в строки.
  • undef становится либо 0, либо '' в зависимости от контекста.

Теперь, когда это не так, позвольте мне прояснить один момент:

Гольф - это игра.

Здорово стремиться к уровню perl-fu, который позволяет вам быть хорошим в этом, но во имя $DIETY не играйте в реальный код. С одной стороны, это ужасная трата времени. Вы могли бы потратить час, пытаясь обрезать несколько символов. Гольф-код хрупок: он почти всегда делает основные предположения и беспечно игнорирует проверку ошибок. Настоящий код не может быть таким небрежным. Наконец, ваша цель как программиста должна заключаться в написании ясного, надежного и обслуживаемого кода. В программировании есть поговорка: Всегда пишите свой код так, как будто человек, который будет его поддерживать, является жестоким социопатом, который знает, где вы живете.

Итак, во что бы то ни стало, начните играть в гольф; но поймите, что он просто играет, и относитесь к нему как к такому.

10 голосов
/ 12 апреля 2010

Большинство людей упускают из виду большую часть синтаксиса Perl и операторов по умолчанию. Perl в основном является языком "DWIM" (что я имею в виду). Одна из его главных целей в дизайне - «сделать простые вещи простыми, а сложные - возможными».

В рамках этого дизайнеры Perl рассказывают о кодировании синтаксиса Хаффмана и думают о том, что нужно делать людям, а не просто дают им низкоуровневые примитивы. Вещи, которые вы часто делаете, должны набирать наименьшее количество текста, а функции должны действовать как наиболее распространенное поведение. Это экономит немало работы.

Например, split имеет много значений по умолчанию, потому что есть некоторые варианты использования, в которых при отбрасывании вещей используется общий случай. Без аргументов split разбивает $_ на пробелах, потому что это очень распространенное использование.

 my @bits = split;

Чуть менее распространенный, но все же частый случай - разбить $_ на что-то еще, поэтому есть немного более длинная версия этого:

 my @bits = split /:/;

И, если вы хотите четко указать источник данных, вы также можете указать переменную:

 my @bits = split /:/, $line;

Думайте об этом, как если бы вы обычно имели дело с жизнью. Если у вас есть обычное задание, которое вы часто выполняете, например, общение с барменом, у вас есть сокращение для обычного случая:

обычный

Если вам нужно что-то сделать, немного по-другому, вы немного расширите это:

обычный, но с луком

Но вы всегда можете отметить особенности

Грязный бомбейский сапфировый мартини встряхивают, не размешивая

Подумайте об этом при следующем посещении веб-сайта. Сколько кликов требуется для выполнения обычных операций? Почему некоторые сайты просты в использовании, а другие нет? В большинстве случаев хорошие веб-сайты требуют от вас наименьшего объема работы для выполнения общих задач. В отличие от моего банка, который требует не менее 13 кликов для оплаты счета кредитной картой. Должно быть очень легко дать им деньги. :)

8 голосов
/ 11 апреля 2010

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

7 голосов
/ 11 апреля 2010

Perl имеет много односимвольных специальных переменных, которые предоставляют множество ярлыков, например, $. $_ $@ $/ $1 и т. Д. Я думаю, что в сочетании со встроенными регулярными выражениями написать очень краткий, но нечитаемый код.

4 голосов
/ 11 апреля 2010

Специальные переменные Perl ($ _, $., $ / И т. Д.) Часто можно использовать для сокращения кода (и его запутанности).

1 голос
/ 12 апреля 2010

Я предполагаю, что «секрет» в том, чтобы обеспечить нативные операции для часто повторяющихся задач.

В домене, который изначально предполагался для perl, вам часто приходится

  • Взять входные данные
  • Удалите пробелы
  • Разрывать строки на слова
  • Ассоциированные пары данных
  • ...

и Perl просто предоставили операторам, чтобы делать эти вещи. Короткие имена переменных и использование значений по умолчанию для многих вещей - просто соус.

Также Perl не был первым языком, который пошел по этому пути. Многие функции Perl были украдены более или менее неповрежденными (или часто слегка улучшенными) из sed и awk и различных оболочек. Хорошо для Ларри.

Конечно, perl был не последним, кто пошёл по этому пути, вы найдете похожие функции в python, php и ruby ​​и ... Людям понравились результаты, и они не собирались отказываться от них, только чтобы получить более регулярный синтаксис .

0 голосов
/ 11 апреля 2010

В чем секрет Java - копировать переменную всего в одну строку, не беспокоясь о шинах и памяти? Ответ: код преобразуется в больший код. Одинаково для всех когда-либо изобретенных языков.

...