Оператор 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; # массив в скалярном контексте вернёт количество элементов
Но это скучно.
в регэкспе съелась обратная черта, скрипт в таком виде печатает «1», число букв «d».
Рассматривать это как рекомендацию воспользоваться яндексом? LOL
Комментарий для maxim-zotov.livejournal.com:
Спасибо! Сейчас поправлю.
Комментарий для mr-simm.livejournal.com:
В данном случае лучше вообще ничем.
Комментарий для mr-simm.livejournal.com:
Надо будет в мои опыты по анимации 25-й кадр вставить :)
Не знал про смайлик. Буду теперь троллить знакомых.
«разумную программу» нужно печатать моноширинным шрифтом же
Комментарий для Евгения Степанищева:
Судя по change log нифига не умирает. Просто из-за отсутствия спроса в enterprise секторе язык полностью перешел в гиковскую среду.
Кстати, он никогда не перетендовал на лавры general programming языка, просто в одно время для разработки под веб ему не было достойной альтернативы.
Комментарий для blog.chaotics.org:
Changelog — это разве показатель? Интересна используемость.
Perl5, который был интересен, появился в 1994. Python — 1990, Ruby — 1995, Lua — 1993, Java — 1995 и так далее.
Комментарий для Zverik:
Я не нашёл хорошего.
Комментарий для Евгения Степанищева:
Используется, просто об этом не кричат на каждом углу восторженные мальчишки, серьёзные дядьки пишут серьёзные проекты. С другой стороны с молодняком проблемы, но в последнее время сообщество стало прикладывать больше усилий для привлечения молодёжи.
Комментарий для dionys.myopenid.com:
Тем не менее, популярность падает очень быстро. Проекты переписываются с Перла на другие языки или забрасываются.
Комментарий для Евгения Степанищева:
Трудно назвать назвать умирающим проект, который каждый месяц выпускает новые релизы для разработчиков и каждый год — новый стабильный релиз.
Цитата из анонса 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? Появились совсем недавно и набирают обороты по популярности.
вот только и остаётся съехать на такие обвинения, т. к. никаких других доводов нет
Комментарий для developerl:
Умирает в плане использования, я это имел ввиду.
Доводов к чему? Я вас не понял.
Комментарий для developerl:
Вы случаем не журналистом работаете? Какой опыт в вырывании фразы из контекста...
Тоже вступлюсь за любимую перловку. Perl — живой и мощный язык, программирую на нем постоянно.
Вероятно, о состоянии проекта perl вы судите по политике Яндекса. Начальство решило «тонну кода, написанного на Perl»
«портировать на новую технологию».
Но может быть, дело не в том, что технология морально устарела, а в том, что скрипт, формирующий выдачу Яндекса, был написан в прошлом веке? Или у вас в компании нет толковых программистов на perl. Решили портировать — портируйте. Но!
С объявления вакансий на создание новой архитектуры SERP Яндекса прошло уже 5 месяцев.
А движения нет. Все тот же старый серп.
Комментарий для Евгения Степанищева:
Не так важно, кто когда появился. Важно кто когда пригодился. Популярность Ruby появилась только в 2005 с запуском RoR.
Комментарий для openid.yandex.ru/nextstation/:
Почему вы пытаетесь за него вступиться? Вы статью-то мою читали?
Вы слабо себе представляете как устроен Яндекс. И, конечно же, я сужу не только по Яндексу. Мои социальные связи распространяются далеко за эту компанию. У Перла, как у языка, другая ниша совершенно. Это очень узкая ниша, его былая популярность — недоразумение.
Это не связанные слова. Выдача Яндекса не имеет отношения к Перлу.
Что это показывает, не могу понять? Значит туда нужно много программистов, а не один. Например, у меня во внутренние сервисы вакансия уже 1,5 года висит. А пришла по ней куча народу.
Вам его просто не видно. Мне — видно.
Странно вы как-то рассуждаете, ей-богу. И не надо от меня Перл защищать. Вы хотя бы первый абзац прочитайте.
Комментарий для blog.chaotics.org:
Я хочу сказать, что былая популярность Перла не обусловлена тем, что в том время ничего больше не было. Было. Причины популярности другие. Перл был общесистемным языком, типа Баша. Когда возникла необходимость программировать динамику, все брали Перл, потому что его знало тогда больше народу. Дальше синергия, чем больше народу знало язык, тем больше хотело знать. Перл стал отраслевым стандартом.
Комментарий для Евгения Степанищева:
Я не пытаюсь, а делаю — высказываю свое мнение по паре тезисов вашей статьи. Это запрещено? Вопрос риторический — из той же серии, что и «Вы статью-то мою читали?» Тезисы, с которыми я не согласен
Ваше восхищение языком как-то плохо вяжется с наречием степени «немного».
это слова вашего сотрудника Anatolix, подискутируйте с ним на эту тему.
Вы имеет в виду — «убрали иконки», «задвинули автосалоны»? Тогда да, изменения есть. Но архитектура-то не изменилась. :-)
Сделайте запрос в Яндексе, посмотрите исходный код страницы, а потом сделайте тоже самое в гугле. Сравните.
Объясняю популярно. Это значит, что Яндекс хочет, но не может.
А причем здесь устройство Яндекса? Что непонятного в задаче «тонну кода, написанного на Perl» «портировать на новую технологию»? Обратите внимание, это цитаты вашего сотрудника.
Комментарий для openid.yandex.ru/nextstation/:
Запрещено менять контекст сказанного, это вносит искажения. В данном случае, вы их внесли.
Там прошедшее время, вы заметили?
Нет, я другое имею ввиду.
Вы не правы. Перечитайте ещё раз пример с вакансией на внутренние сервисы.
Устройство «Яндекса» относилось к вашей конкретной фразе про начальство.
Покажите, где я это сделал.
А вы заметили вот это:
Прочитайте уж весь пост вашего коллеги (как я ваш)
Архитектурные изменения?
В чем именно? В том, что Яндекс хочет, прав — «хотим ее поменять» — слова Anatolix.
В том что не может — поживем-увидим.
Комментарий для openid.yandex.ru/nextstation/:
Каюсь, перепутал вас с другим комментатором.
Дайте ссылку.
Да, их.
Мне изнутри «Яндекса» видно, что процессы, которые, по вашим словам, не происходят, идут.
А tubgirl operator пока ещё не придумали?
Комментарий для MrRomazza:
Я не знаю что это. Наверное, мне не стоит это знать :)