Что такое секрет Perl для получения небольшого кода?

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

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

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

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

Ответ 1

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

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

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

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

Теперь, чтобы это было в стороне, позвольте мне быть предельно ясным в одном пункте:

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

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

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

Ответ 2

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

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

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

 my @bits = split;

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

 my @bits = split /:/;

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

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

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

Обычный

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

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

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

Грязный Бомбейский сапфировый мартини не взбалтывается

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

Ответ 3

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

Ответ 4

Perl имеет множество уникальных переменных с одним символом, которые предоставляют множество ярлыков, например $. $_ [email protected] $/ $1 и т.д. Я думаю, что это в сочетании со встроенными регулярными выражениями позволяет вам написать очень сжатый, но нечитаемый код.

Ответ 6

Я бы предположил, что "секрет" заключается в предоставлении собственных операций для часто повторяющихся задач.

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

  • Взять входную строку
  • Отключить пробелы
  • Рип-строки в слова
  • Связанные пары данных
  • ...

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

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

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

Ответ 7

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