LINUX.ORG.RU

Perl Weekly Challenge

 , , , ,


2

3

Весёлые старты для любителей Perl'а и всех кто хочет попробовать силы в чёрной магии.

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

Упор сделан на TIMTOWTDI. Организатор просит избегать гольфа и JAPH, в остальном: «Пусть расцветают сто цветов».

По итогам пишут отчёт с наиболее интересными решениями.

Цель: популяризация Perl, обмен опытом и веселье!

>>> Подробности

Ответ на: комментарий от Lilly

учится вполне нормально

Да просто очень много всего, ну и непривычно для погрязших в си синтаксисе. Ну и грамматики вкурить сложно.

q0tw4 ★★★★ ()
Ответ на: комментарий от perl5_guy

Читабельные регулярки с парсером грамматик из коробки это одна из самых интересных киллерфич, по крайней мере, для меня. Но это не самое «худшее», что может быть в процессе предполагаемой 5to6 трансляции, как мне кажется. https://github.com/edumentab/p6-ecma262regex <- вот здесь я писал транслятор из ECMA 262 регулярок в Perl 6, полёт был очень приятный(да, естественно, стандарт Perl 5 сильно жёстче будет, чем у js).

Скорее, появились разные конструкции типа with, нормальные и даже скорее весьма богатые сигнатуры для рутин, разные там приватные методы, богатое конкаренси и параллелизм с промисами и react-whenever красотой, ООП с метаобъектным протоколом и ролями, приятный NativeCall для интероперабельности с С, вместо XS, от которого вроде как многие плюются. Короче, за транслятор, который будет всё это учитывать и писать «разумный» код, несколько известных премий в области информатики точно можно получить, но сдаётся мне, проект сложнее, чем кажется.

Плюс есть такой момент, что шишки некоторых либ уже хорошо известны и их можно решать в процессе. К примеру, архитектор, отвечающий в том числе за канкаренси-паралеллизм-асинхронность, несколько лет преподавал RXJava и соседние «крутые» технологии в этой теме разным компаниям, в примитивах же для Perl 6 он придумал-реализовал то, «как оно должно быть красиво». Как итог, когда мне довелось немного писать на этой же RXJava вместо Perl 6, кроме мысли «Неужели можно простые вещи делать так неестественно?» особо ничего в голову не приходило(хотя, сам я не авторитет в области, так что просто субъективщина).

Lilly ()
Ответ на: комментарий от q0tw4

К счастью, как говорят, «Можно не знать 100% языка, чтобы успешно писать на нём».

Ну и грамматики вкурить сложно

Бывает такая тема, практика помогает, ну и вообще знакомство с парсингом как таковым. Если видел когда-то в глаза какой-нибудь lex/yacc, то уже проще. У меня такое бывает, когда просто берёшь ABNF из стандарта какого-нибудь протокола и прям каждое правило записываешь в грамматику с минимумом различий(один чувак даже компилятор написал BNF->Perl 6 grammar, но как-то лень разбираться, да и я не так часто это делаю). Не нужно генерить сорцы, линковать, потом перегенеривать, если поменялся пробел где-то, просто садишься и «поехали».

Lilly ()
Ответ на: комментарий от Lilly

Негативный посыл слышу я. Конечно у Perl-сообщества накоплен огромный опыт в плане регулярных выражений и скорей всего, переписанные с нуля регулярки шестёрки, будут читабельней чем существующие. Но и классическая версия мне очень нравится. Моё отношение к ней — строго положительное. За годы моей профессиональной деятельности, я могу только пару раз припомнить, когда регулярки создавали проблемы. Обычно бочку катят разработчики на других языках и поводом для их истерик является что-то вроде:

/^\s*$/
Я считаю что админу и, уж тем более программисту, стыдно не знать основы регулярных выражений

perl5_guy ★★ ()
Ответ на: комментарий от perl5_guy

Негативный посыл слышу я

Надеюсь, просто показалось. Меня, если честно, достаточно напрягают сопутствующие драмы с названиями, тем, какой язык мёртв, а какой не очень, и тому подобные пустые траты времени, поэтому я очень сильно от них держусь подальше. Вместо выяснения, кто в чём не прав, можно запилить немного кода, -Ofun же. Мне нравится нарратив про «sister languages» и я не вижу с ним особо проблем. Очевидно, что Perl 5 не стоит на месте, просто «так сложилось исторически», что хоть я и почитывал в детстве Learning Perl, но в реальности разве что портирую модули изредка, так что я изначально направлен на 6 и по работе и хобби, скажем так. Я не могу «всерьёз» ругать Perl, который я практически не знаю, нелюбовь по обложке это мммм.

Если я делаю сравнение, мол, «Здесь код 5 не очень, а здесь код 6 приятнее», то это просто сравнение в плане того, что «Фича Х позволяет писать Y вот так». Но достаточно ясно, что нынешний rakudo/moarvm стек проигрывает в производительности, оптимизации по памяти, да просто распространённости/доступности, есть баги, не без них, есть полно papercuts, так что в пятом ситуация получше будет по всем этим пунктам.

Lilly ()

Гольфа нет, не интересно.

anonymous ()
Ответ на: комментарий от anonymous

Ну и ты всегда можешь играть в гольф, не говоря об этом другим. :3

Вот чего я на прошлой неделе прислал (даже комментарий про eval оставил спецом для таких как ты, Тайгер Вудс):

#!/usr/bin/env perl -p

# echo 1,2,3,4,42,43,45 | ch-1.pl

use 5.028.1;
use List::Util qw(sum);

s{
    ( \b \d+   )
    ( ,? \d+ , )+
    (    \d++  )
    (??{
        # this block is treated as a pattern
        # != will return '' (match) or 1 (fail, because \d++ will swallow all)
        # sum( eval $& ) will work too (;
        ( $3 - $1 + 1 ) * ( $1 + $3 ) / 2 != ( sum( split ',', $& ) || -1 );
    })
}
{$1-$3}xg;

Задание было:

Create a script which takes a list of numbers from command line and print the same in the compact form. For example, if you pass “1,2,3,4,9,10,14,15,16” then it should print the compact form like “1-4,9,10,14-16”.

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

perl5_guy ★★ ()
Последнее исправление: perl5_guy (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.