Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Оператор goatse в Перле

Внезапно вспомним Перл. Когда-то я на нём много и в удовольствием программировал, причём этот навык не утерян мною до сих пор. Хотя попрограммировать на этом девиантном языке мне удаётся редко, я по-прежнему им восхищён. Немного жаль, что он умирает, но право же, чаще программы на нём можно слать в передачу «А вам слабо?», чем в продакшн.

Есть такая шутка, что Перл единственный язык, программа на котором до и после RSA-шифрования выглядит одинаково. Честно сказать, я не уверен, что это шутка, так как вот это, например, вполне разумная программа на Перле:

not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q join use sub tied qx
xor eval xor print qq q q xor int
eval lc q m cos and print chr ord
for qw y abs ne open tied hex exp
ref y m xor scalar srand print qq
q q xor int eval lc qq y sqrt cos
and print chr ord for qw x printf
each return local x y or print qq
s s and eval q s undef or oct xor
time xor ref print chr int ord lc
foreach qw y hex alarm chdir kill
exec return y s gt sin sort split

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

Я постараюсь пропустить неаппетитные подробности, но есть такой мем «goatse» — это картинки мужичка, в деталях показывающего свою тёмную неизвестность, а так же пародии на неё. Не гуглите пожалуйста это, прошу, нет, даже умоляю, не надо. Та картинка, как любой шок-контент, используется в троллинге.

Для нас важно, что после того как картинка стала мемом, появился смайлик „=()=“, довольно точно отражающий её суть. Я знаю эту преамбулу, потому что однажды какой-то экспериментатор нашёл в Перле то, что назвали goatse operator — тот самый „=()=“, который, что интересно, позволяет делать довольно разумную вещь.

Например, вам нужно подсчитать сколько цифр содержится в строке. На помощь вам придёт goatse operator!

my $s = "Hello, world! This is a Perl! 123456";
my $c =()= $s =~ /\d/g;
print $c;

В результате будет напечатано число шесть.

Как это работает и почему нельзя как-то иначе?

Сначала отвечу на первую часть.

Самое правое выражение в рассматриваемой строчке — регулярное выражение, которое ищет одну цифру, оператором «=~» мы применяем его к конкретной переменной, а ключ «g» в конце регулярки говорит, что искать надо все вхождения.

В Перле есть понятие скалярного и списочного контекста. Результат может сильно отличаться в зависимости от того ожидается ли в каком-то месте кода скаляр или список (массив). Программист даже может проверить в каком контексте вызвана его функция при помощи специальной функции «wantarray».

Например, если я попробую напрямую присвоить результат выполнения регулярного выражения на переменной „s“ в скалярную переменную (начинается с доллара), то я получу флаг, показывающий встретились ли вообще цифры в рассматриваемой переменной. Если же присвоить тот же результат массиву (имя переменной начинается с «@»), то я получу массив совпадений.

С goatse operator происходит следующее.

На деле «() = что-то ещё» — это обычное присваивание массиву чего-то ещё. Пустые скобки — пустой анонимный массив, ему тоже можно что-то присвоить, синтаксис это позволяет. Таким образом контекст не скалярный и мы всего-то присваиваем одному массиву другой. Дальше чуть интереснее. По правилам Перла присваивание первого массива второму в скалярном контексте возвращает количество элементов первого.

Получается «SCALAR = LIST0 = LISTREGEXP», что возвращает нам количество элементов массива LISTREGEXP при любом не константном LIST0. Двумя присваиваниями, идущими подряд, вряд ли кого-то удивишь, цепочки присваиваний можно использовать в Си, JavaScript, PHP и куче других языков.

Теперь ответ на второй вопрос. Нельзя ли как-то иначе. Можно. Если религия вам не позволяет использовать «оператор» с такими сомнительными ассоциациями, то можно, например, присвоить результат работы регулярного выражения переменной-массиву, а потом взять его в скалярном контексте. Как-то так:

my $s = "Hello, world! This is a Perl! 123456";
my @c =$s =~ /\d/g;
print scalar @c; # массив в скалярном контексте вернёт количество элементов

Но это скучно.

25 комментариев
Максим Зотов (maxim-zotov.livejournal.com) 2011

my $c =()= $s =~ /d/g;
В результате будет напечатано число шесть.

в регэкспе съелась обратная черта, скрипт в таком виде печатает «1», число букв «d».

SiMM (mr-simm.livejournal.com) 2011

Не гуглите пожалуйста это, прошу, нет, даже умоляю, не надо.

Рассматривать это как рекомендацию воспользоваться яндексом? LOL

Я — ... Работаю в Яндексе

Евгений Степанищев (bolknote.ru) 2011

Комментарий для maxim-zotov.livejournal.com:

в регэкспе съелась обратная черта, скрипт в таком виде печатает «1», число букв «d».

Спасибо! Сейчас поправлю.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для mr-simm.livejournal.com:

Рассматривать это как рекомендацию воспользоваться яндексом? LOL

В данном случае лучше вообще ничем.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для mr-simm.livejournal.com:

Надо будет в мои опыты по анимации 25-й кадр вставить :)

xorax (xorax.livejournal.com) 2011

Не знал про смайлик. Буду теперь троллить знакомых.

Zverik 2011

«разумную программу» нужно печатать моноширинным шрифтом же

Sergey Palyanov (blog.chaotics.org) 2011

Комментарий для Евгения Степанищева:

Немного жаль, что он умирает

Судя по change log нифига не умирает. Просто из-за отсутствия спроса в enterprise секторе язык полностью перешел в гиковскую среду.
Кстати, он никогда не перетендовал на лавры general programming языка, просто в одно время для разработки под веб ему не было достойной альтернативы.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для blog.chaotics.org:

Changelog — это разве показатель? Интересна используемость.

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

Perl5, который был интересен, появился в 1994. Python — 1990, Ruby — 1995, Lua — 1993, Java — 1995 и так далее.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для Zverik:

«разумную программу» нужно печатать моноширинным шрифтом же

Я не нашёл хорошего.

Denis Ibaev (dionys.myopenid.com) 2011

Комментарий для Евгения Степанищева:

Интересна используемость.

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

Евгений Степанищев (bolknote.ru) 2011

Комментарий для dionys.myopenid.com:

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

developerl 2011

Комментарий для Евгения Степанищева:

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

Цитата из анонса 5.14.0:
«Perl 5.14.0 represents one year of development since Perl 5.12.0 and
contains nearly 550,000 lines of changes across nearly 3,000 files from
150 authors and committers.»

Вы слышали о веб-фреймворках Dancer, Mojolicious? Появились совсем недавно и набирают обороты по популярности.

... каким ненатуралом надо быть, чтобы программировать на этом языке ...

вот только и остаётся съехать на такие обвинения, т. к. никаких других доводов нет

Евгений Степанищев (bolknote.ru) 2011

Комментарий для developerl:

Трудно назвать назвать умирающим проект, который каждый месяц выпускает новые релизы для разработчиков и каждый год — новый стабильный релиз

Умирает в плане использования, я это имел ввиду.

вот только и остаётся съехать на такие обвинения, т. к. никаких других доводов нет

Доводов к чему? Я вас не понял.

anon 2011

Комментарий для developerl:

... каким ненатуралом надо быть, чтобы программировать на этом языке ...

... Очень много шуток есть по поводу того, каким ненатуралом надо быть, чтобы программировать на этом языке ...

Вы случаем не журналистом работаете? Какой опыт в вырывании фразы из контекста...

nextstation (openid.yandex.ru/nextstation/) 2011

Тоже вступлюсь за любимую перловку. Perl — живой и мощный язык, программирую на нем постоянно.
Вероятно, о состоянии проекта perl вы судите по политике Яндекса. Начальство решило «тонну кода, написанного на Perl»
«портировать на новую технологию».
Но может быть, дело не в том, что технология морально устарела, а в том, что скрипт, формирующий выдачу Яндекса, был написан в прошлом веке? Или у вас в компании нет толковых программистов на perl. Решили портировать — портируйте. Но!
С объявления вакансий на создание новой архитектуры SERP Яндекса прошло уже 5 месяцев.
А движения нет. Все тот же старый серп.

Sergey Palyanov (blog.chaotics.org) 2011

Комментарий для Евгения Степанищева:

Perl5, который был интересен, появился в 1994. Python — 1990, Ruby — 1995

Не так важно, кто когда появился. Важно кто когда пригодился. Популярность Ruby появилась только в 2005 с запуском RoR.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для openid.yandex.ru/nextstation/:

Тоже вступлюсь за любимую перловку. Perl — живой и мощный язык, программирую на нем постоянно.

Почему вы пытаетесь за него вступиться? Вы статью-то мою читали?

Вероятно, о состоянии проекта perl вы судите по политике Яндекса. Начальство решило «тонну кода, написанного на Perl» «портировать на новую технологию»

Вы слабо себе представляете как устроен Яндекс. И, конечно же, я сужу не только по Яндексу. Мои социальные связи распространяются далеко за эту компанию. У Перла, как у языка, другая ниша совершенно. Это очень узкая ниша, его былая популярность — недоразумение.

Но может быть, дело не в том, что технология морально устарела, а в том, что скрипт, формирующий выдачу Яндекса, был написан в прошлом веке?

Это не связанные слова. Выдача Яндекса не имеет отношения к Перлу.

С объявления вакансий на создание новой архитектуры SERP Яндекса прошло уже 5 месяцев.

Что это показывает, не могу понять? Значит туда нужно много программистов, а не один. Например, у меня во внутренние сервисы вакансия уже 1,5 года висит. А пришла по ней куча народу.

А движения нет. Все тот же старый серп.

Вам его просто не видно. Мне — видно.

Странно вы как-то рассуждаете, ей-богу. И не надо от меня Перл защищать. Вы хотя бы первый абзац прочитайте.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для blog.chaotics.org:

Не так важно, кто когда появился. Важно кто когда пригодился. Популярность Ruby появилась только в 2005 с запуском RoR.

Я хочу сказать, что былая популярность Перла не обусловлена тем, что в том время ничего больше не было. Было. Причины популярности другие. Перл был общесистемным языком, типа Баша. Когда возникла необходимость программировать динамику, все брали Перл, потому что его знало тогда больше народу. Дальше синергия, чем больше народу знало язык, тем больше хотело знать. Перл стал отраслевым стандартом.

nextstation (openid.yandex.ru/nextstation/) 2011

Комментарий для Евгения Степанищева:

Почему вы пытаетесь за него вступиться? Вы статью-то мою читали?

Я не пытаюсь, а делаю — высказываю свое мнение по паре тезисов вашей статьи. Это запрещено? Вопрос риторический — из той же серии, что и «Вы статью-то мою читали?» Тезисы, с которыми я не согласен

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

Ваше восхищение языком как-то плохо вяжется с наречием степени «немного».

Это не связанные слова. Выдача Яндекса не имеет отношения к Перлу.
Исторически поисковая выдача Яндекса aka SERP (Search Engine Report Page) формировалась perl-скриптом

это слова вашего сотрудника Anatolix, подискутируйте с ним на эту тему.

Вам его просто не видно. Мне — видно.

Вы имеет в виду — «убрали иконки», «задвинули автосалоны»? Тогда да, изменения есть. Но архитектура-то не изменилась. :-)
Сделайте запрос в Яндексе, посмотрите исходный код страницы, а потом сделайте тоже самое в гугле. Сравните.

Что это показывает, не могу понять?

Объясняю популярно. Это значит, что Яндекс хочет, но не может.

Вы слабо себе представляете как устроен Яндекс

А причем здесь устройство Яндекса? Что непонятного в задаче «тонну кода, написанного на Perl» «портировать на новую технологию»? Обратите внимание, это цитаты вашего сотрудника.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для openid.yandex.ru/nextstation/:

Я не пытаюсь, а делаю — высказываю свое мнение по паре тезисов вашей статьи. Это запрещено?

Запрещено менять контекст сказанного, это вносит искажения. В данном случае, вы их внесли.

это слова вашего сотрудника Anatolix, подискутируйте с ним на эту тему.

Там прошедшее время, вы заметили?

Вы имеет в виду — «убрали иконки», «задвинули автосалоны»? Тогда да, изменения есть.

Нет, я другое имею ввиду.

Объясняю популярно. Это значит, что Яндекс хочет, но не может.

Вы не правы. Перечитайте ещё раз пример с вакансией на внутренние сервисы.

А причем здесь устройство Яндекса? Что непонятного в задаче «тонну кода, написанного на Perl» «портировать на новую технологию»? Обратите внимание, это цитаты вашего сотрудника.

Устройство «Яндекса» относилось к вашей конкретной фразе про начальство.

nextstation (openid.yandex.ru/nextstation/) 2011

Запрещено менять контекст сказанного

Покажите, где я это сделал.

Там прошедшее время, вы заметили?

А вы заметили вот это:

в данный момент мы считаем ее морально устаревшей и хотим ее поменять.

Прочитайте уж весь пост вашего коллеги (как я ваш)

Нет, я другое имею ввиду.

Архитектурные изменения?

Вы не правы

В чем именно? В том, что Яндекс хочет, прав — «хотим ее поменять» — слова Anatolix.
В том что не может — поживем-увидим.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для openid.yandex.ru/nextstation/:

Покажите, где я это сделал.

Каюсь, перепутал вас с другим комментатором.

Прочитайте уж весь пост вашего коллеги (как я ваш)

Дайте ссылку.

Архитектурные изменения?

Да, их.

В том что не может — поживем-увидим.

Мне изнутри «Яндекса» видно, что процессы, которые, по вашим словам, не происходят, идут.

MrRomazza 2011

А tubgirl operator пока ещё не придумали?

Евгений Степанищев (bolknote.ru) 2011

Комментарий для MrRomazza:

Я не знаю что это. Наверное, мне не стоит это знать :)