- PVSM.RU - https://www.pvsm.ru -

Что должен знать начинающий Perl разработчик о перловой инфраструктуре

В связи с тем что дефицит кадров в ИТ отрасли велик, а перловиков совсем мало (а те что есть уже хотят быть техдирами и получать много денег) многие конторы с радостью берут способную молодёжь для превращения в перловиков.
Компания в которой я сейчас работаю тоже об этом задумалась и я вспомнил свою идею набросать некую шпаргалку-карту для начинающих шеф-поваров по приготовлению перловой каши.

Сразу хотелось бы отмести разговоры о смерти перла, вроде где-то тут [1] не помню кто писал, что если технология перестала быть модной и кажется мёртвой, то это означает, что технология зрелая, понятна её область применения и нужно идти и работать, а не трещать языками.
Perl 6 считаю другим языком и его долгое и мучительно рождение не мешает жить и развиваться перлу.

Конечно бывает что технологии умирают, однако если посмотреть на даты в истории коммитов в репозитории [2] перла и даты в ленте заливки/обновления [3] дополнительных модулей, то не скажешь что перл зачах — жизнь кипит ежедневно. Как-то я специально мониторил модули на CPAN [4] — десятки модулей обновляются/заливаются ежедневно.

Также отмечу что весь свободный софт, и перл не исключение, делается для Unix-подобных ОС, на винде всё это можно делать, но не нужно, рекомендую сразу осваивать нормальную для девелопера ОС (GNU/Linux, FreeBSD).

Как обычно всё будет в шпаргалочном стиле, ссылки будут в основном на официальные доки, всяких док для быстрого старта полно в сети:

— Ньютон говорил что он увидел дальше, потому что стоял на плечах гигантов, имея ввиду Галилея и других. Таким образом Ньютон намекал разработчикам не писать, то что уже написано. А то что уже написано для перла обычно лежит на CPAN [5], ставить это можно как из репозитория вашего дистрибутива (но там обычно есть не всё), так и родной утилитой cpan и её вариациями cpanp, cpanm. Писать своё конечно можно, но только если текущие реализации чем-то не устраивают или хочется хорошо понять как это работает.
— И хотя о необходимости отладчика нет единого мнения, отладчик в перле есть, и желательно хотя бы минимально владеть им: perl -d имя_скрипта
— Померить производительность кода можно с помощью модуля Devel::NYTProf [6], на эту тему есть презентация [7] (для поиска утечек памяти тоже есть модули, но не знаю какой сейчас правильный)
— для модульного тестирования есть Test::More [8] и mock модули типа Test::MockObject [9], ну и пара статей: про mock [10] и нефункциональные тесты [11].
— Минимальный заголовок перлового скрипта/модуля

use strict;
use warnings;
use utf8;
use open (:utf8 :std);
use v5.16;

Есть модули для того чтобы одной строкой подключить всё что нужно (Modern::Perl [12], uni::perl [13], common::sense [14]), но они подключают разный набор модулей — мне например отключение undefined варнингов не подходит, но нет никакой проблемы сделать свой модуль.
— нужно понимать как перл работает с utf-8 (точнее хотя бы знать что не всё так просто) — дока [15], статья [16] (в конце статьи ссылка на ещё одну статью)
— стоит знать и юзать хорошие практики [17] и нарушать только понимая почему и зачем, утилита perlcritic может подсказать где отступили от «священного писания» (надеюсь не оскорбил никаких верующих)
— стиль кодирования это отдельная тема, за основу нужно брать этот документ [18]. Утилита perltidy умеет приводить стиль кодирования к описанному в конфигурации = ей можно быстро причесать чей-то криво форматированный код.
— перл имеет достаточно удобную документацию, которой можно пользоваться и без коннекта к сети:

perldoc -f имя_функции
perldoc perlre
perldoc perlvar
и т.д.

Понятно что то же самое есть в красивом виде в сети: perldoc [19], для запоминания всяких особенностей возможно будет полезна такая шпаргалка [20], или расширенная шпаргалка [21] и шпора по ссылкам [22], также всегда может помочь сообщество [23], в частности есть рассылка московских перловиков [24].
— создание модулей описано в документации [25], хотя думаю сейчас их чаще делают в ООП стиле, читать тут [26] и тут [27].
— документирование — POD [28]
— свои модули разумно оформлять также как модули для CPAN (вполне вероятно что туда их и будете заливать), для упрощения это процедуры есть куча модулей типа ExtUtils::MakeMake [29] и Module::Starter [30] (ещё есть Dist::Zilla [31], но он без инсталлятора)
— Обработка исключений это eval (они имеет две формы, одна с аргументом-строкой это именно eval, а вторая с аргументом-кодом это уже больше try), есть неплохой вариант Try::Tiny [32].
— модуль Carp [33] предоставляет аналоги warn и die со значительно более информативным выводом.
— Однострочки позволяют вам быстро сделать что-то небольшое, например проверить есть ли модуль в системе perl -E 'use SOAP::Lite'.
— вывести сложную структуру в лог/на экран можно модулем Data::Dumper [34], Data::Dump [35] немного красивше, JSON::XS [36] много быстрее и больше подходит для маршалинга [37], но и для отладочного вывода можно использовать.
— неплохой формат для конфигов YAML [38], модуль YAML::XS [39].
— Бывает нужно понять от каких модулей зависит скрипт/модуль, тот могут пригодится модули типа Module::ScanDeps [40]
— самый актуальный на данный момент web-framework Mojolicious [41].
— валидировать параметры функции можно готовыми модулями, например Params::Validate [42].
— для логгирования есть готовые модули, например Log::Log4perl [43], Log::Dispatch [44] и универсальная обёртка над разными логгерами Log::Any [45].
— для разбора параметров командной строки есть модуль Getopt::Long [46].
— IDE? настраивайте vim, emacs или любой иной продвинутый консольный редактор, не нужно монстров.
— базовая книга это «Programming Perl» Larry Wall, Tom Christiansen, Jon Orwant она же книга с верблюдом, если хочется понимать больше «Advanced Perl Programming» Sriram Srinivasan.

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

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

Автор: worldmind


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/perl/17083

Ссылки в тексте:

[1] тут: http://blogs.perl.org/

[2] репозитории: http://perl5.git.perl.org/perl.git

[3] ленте заливки/обновления: http://search.cpan.org/uploads.rdf

[4] CPAN: http://www.cpan.org/

[5] CPAN: http://search.cpan.org/

[6] Devel::NYTProf: http://search.cpan.org/perldoc/?Devel::NYTProf

[7] презентация: http://www.slideshare.net/Tim.Bunce/develnytprof-v4-at-yapceu-201008-4906467

[8] Test::More: http://search.cpan.org/perldoc/?Test::More

[9] Test::MockObject: http://search.cpan.org/perldoc/?Test::MockObject

[10] про mock: http://habrahabr.ru/post/142667/

[11] нефункциональные тесты: http://habrahabr.ru/post/111655/

[12] Modern::Perl: http://search.cpan.org/perldoc/?Modern::Perl

[13] uni::perl: http://search.cpan.org/perldoc/?uni::perl

[14] common::sense: http://search.cpan.org/perldoc/?common::sense

[15] дока: http://perldoc.perl.org/utf8.html

[16] статья: http://habrahabr.ru/post/53578/

[17] хорошие практики: http://en.wikipedia.org/wiki/Perl_Best_Practices

[18] этот документ: http://perldoc.perl.org/perlstyle.html

[19] perldoc: http://perldoc.perl.org/

[20] шпаргалка: http://search.cpan.org/perldoc/?perlcheat

[21] расширенная шпаргалка: http://www.cheatography.com/mishin/cheat-sheets/perlcheat/

[22] шпора по ссылкам: http://michaelgoerz.net/refcards/perl_refcard.pdf

[23] сообщество: http://www.pm.org/

[24] рассылка московских перловиков: http://moscow.pm.org/

[25] документации: http://perldoc.perl.org/search.html?r=no&q=perlmod

[26] тут: http://perldoc.perl.org/perlootut.html

[27] тут: http://perldoc.perl.org/perlobj.html

[28] POD: http://perldoc.perl.org/perlpod.html

[29] ExtUtils::MakeMake: http://search.cpan.org/perldoc/?ExtUtils::MakeMaker

[30] Module::Starter: http://search.cpan.org/perldoc/?Module::Starter

[31] Dist::Zilla: http://search.cpan.org/perldoc/?Dist::Zilla

[32] Try::Tiny: http://search.cpan.org/perldoc/?Try::Tiny

[33] Carp: http://search.cpan.org/perldoc/?Carp

[34] Data::Dumper: http://search.cpan.org/perldoc/?Data::Dumper

[35] Data::Dump: http://search.cpan.org/perldoc/?Data::Dump

[36] JSON::XS: http://search.cpan.org/perldoc/?JSON::XS

[37] маршалинга: http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D1%88%D0%B0%D0%BB%D0%B8%D0%BD%D0%B3

[38] YAML: http://ru.wikipedia.org/wiki/YAML

[39] YAML::XS: http://search.cpan.org/perldoc/?YAML::XS

[40] Module::ScanDeps: http://search.cpan.org/perldoc/?Module::ScanDeps

[41] Mojolicious: http://mojolicio.us/

[42] Params::Validate: http://search.cpan.org/perldoc/?Params::Validate

[43] Log::Log4perl: http://search.cpan.org/perldoc/?Log::Log4perl

[44] Log::Dispatch: http://search.cpan.org/perldoc/?Log::Dispatch

[45] Log::Any: http://search.cpan.org/perldoc/?Log::Any

[46] Getopt::Long: http://search.cpan.org/perldoc/?Getopt::Long