В чем секрет Perl, позволяющий сделать так много небольшого кода?

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

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

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

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


person sak    schedule 11.04.2010    source источник
comment
Хотя можно задаться вопросом о цели - я хочу писать сценарии, даже если я больше не понимаю их через неделю - это вполне разумный вопрос и на него можно дать ответ. Его следует снова открыть. Хороший ответ должен отметить такие вещи, как (а) история Perl, исходящая из системного администратора, sed, awk-культуры; (b) использование Perl специальных переменных и параметров запуска для облегчения разработки однострочных скриптов в контексте конвейеров Unix; (c) аргумент Perl по умолчанию $_; и, возможно, еще кое-что.   -  person FMc    schedule 11.04.2010
comment
Это закрыто по причине невозможности дать объективный ответ на этот вопрос; вопросы этого типа слишком открыты и обычно приводят к конфронтации и спорам. Часть о конфронтации и споре полностью и полностью надумана - этот вопрос не приведет к конфронтации и спору. Я проголосовал за повторное открытие. Если вы хотите что-то закрыть, закройте, пожалуйста, по реальной причине.   -  person    schedule 11.04.2010
comment
@Kinopiko: ну ладно, cwiki? Ясно, что у него нет одного правильного ответа.   -  person bmargulies    schedule 12.04.2010
comment
Я думаю, это должна быть вики сообщества   -  person John La Rooy    schedule 12.04.2010
comment
Я не согласен. Какие характеристики Perl делают его таким подходящим для игры в гольф? очевидно, что у действительно есть объективно правильные (то есть правильные) ответы.   -  person Dave Sherohman    schedule 12.04.2010
comment
Просто любопытно: зачем вы хотите писать программы, которые через неделю не поймете? Я просто надеюсь, что вы понимаете, что все, что люди делают, чтобы получить такие маленькие ответы на вопросы кода, - это действительно плохая практика!   -  person Igby Largeman    schedule 13.04.2010


Ответы (7)


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

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

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

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

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

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

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

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

person Michael Carman    schedule 11.04.2010
comment
Отличный ответ. У меня также есть ощущение, что ориентация Perl на списки может быть полезна для игры в гольф, но я не уверен и не знаю, как это сформулировать. - person FMc; 12.04.2010
comment
В Perl есть типизация данных. Просто от программиста не требуется указывать Perl, что это за типы - предполагается, что программист будет придерживаться их. - person jrockway; 12.04.2010
comment
Джон почти прав. Perl очень типизирован. Скаляр - это скаляр, массив - это массив, а хеш - это хеш. Вы не можете изменить тип переменной. Он просто не пытается еще больше разделить то, что вы вложили в скаляр. Это просто одно значение. Однако Perl негласно отслеживает строковые, целые числа и версии с плавающей запятой для скалярных значений. - person brian d foy; 12.04.2010

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

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

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

 my @bits = split;

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

 my @bits = split /:/;

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

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

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

Обычно

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

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

Но всегда можно отметить специфику

Грязный мартини Bombay Sapphire, взболтанный, но не перемешанный

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

person brian d foy    schedule 12.04.2010

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

person Community    schedule 11.04.2010
comment
+1 еще для J. См., Например, последнюю программу, которую я написал на J (с пояснением): stackoverflow.com/questions/2639281/ - person David; 16.04.2010

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

person Tom Jefferys    schedule 11.04.2010

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

person Eugene Yarmash    schedule 11.04.2010

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

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

  • Принимайте ввод линейно
  • Удалите пробелы
  • Разорвать строки на слова
  • Связанные пары данных
  • ...

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

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

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

person dmckee --- ex-moderator kitten    schedule 11.04.2010

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

person Amy B    schedule 11.04.2010
comment
Я хотел знать, что в синтаксисе Perl позволяет вам это делать - person sak; 11.04.2010
comment
Ага ... вот что я ответил. - person Amy B; 11.04.2010
comment
@Coronatus: Не совсем. код преобразован в более крупный код не является свойством синтаксиса. - person sepp2k; 11.04.2010
comment
Я имею в виду что в синтаксисе Perl. Не почему. Например: пробел не является обязательным, есть конструкция, которая позволяет это сделать и т. Д. - person sak; 11.04.2010
comment
Пробелы не обязательны для большинства языков. Python - одно из исключений. - person Quentin; 11.04.2010
comment
Что вообще означает этот ответ? копирование переменной только в одну строку? Вы имеете в виду управление памятью с помощью ссылок на объекты, собранные сборщиком мусора? беспокоишься об автобусах ...? Кто занимается этим, кроме написания машинного кода для некоторых устройств? преобразован в более крупный код? В каком смысле? - person MtnViewMark; 13.04.2010