Я и Perl

Технология Perl мне показалась привлекательной еще в начале 2000-ых. Тогда это был некий прорыв и язык начал приобретать стремительный оборот у специалистов в разных областях применения. Я пошел по пути использования языка в качестве инструмента для написания web-сценариев. Сначала это были CGI скрипты, позже mod_perl а последнее время – mod_perl2. Многие меня спрашивают – «почему Perl, а не PHP». Я всегда затрудняюсь ответить на этот вопрос, но считаю что Perl это мощнейший язык который я когда-то встречал! Он проще в использовании относительно языка C, но в тоже время богаче по функциональным возможностям, чем PHP. Возьмем, например, регулярные выражения – это очень сильный аргумент в пользу Perl.

Мою точку зрения могут разделять, а могут не разделять – но я свой выбор сделал! Что касается PHP – я не считаю, что это плохой язык, с его помощью можно много что сделать, большинство разработчиков выбрало именно PHP.

Здесь уместно привести маленький простой кусочек кода, который я написал не так давно для одного из моих текущих проектов и который может продемонстрировать как в лаконичном куске кода можно уложить богатый функционал Perl:

my @apts;
my %aptsh = getApartmentsAsHash();
my $rooms = calcRooms();
foreach (0..$rooms) { $apts[$_] = [0,[]] }
foreach (keys %aptsh) {
    $apts[$aptsh{$_}->{r}][0] = $aptsh{$_}->{cnt};
    push @{$apts[$aptsh{$_}->{r}][1]}, {
        id  => $aptsh{$_}->{id},
        r   => $aptsh{$_}->{r},
        g   => $aptsh{$_}->{g},
    };
}

Комментарий:
Выполняется типовой запрос в БД Oracle, из конфигурации принимается динамическое значение – количество комнат, устанавливается значение по умолчанию в ожидаемом диапазоне количества комнат до 300, о заранее установленным значениям из результата работы запроса SQL корректировка только выбранных значений – результатом всего этого появляется массив значений который в дальнейшем (по ходу кода) отображается на сайте в виде таблицы.

По этому примеру трудно сказать что Perl лучше или хуже чем PHP, я вообще не хочу их сравнивать, так как это разные системы и некоторые конструкции PHP будут выглядеть лучше чем конструкции на Perl.

CPAN

Одно из достойных отличительных особенностей является CPAN! Это громадное преимущество, которое используют все профессиональные разработчики работающие с Perl. Обилие библиотек, качество исполнение, полнейшая документация, система bag-трекинга и многое другое заключается в одном лишь CPAN. У меня на памяти несколько решений, которые решались всего 3-мя строчками кода когда как на том-же PHP это целая программа! Мне удалось найти такой кусок кода, я его тут приведу:

#!/usr/bin/perl -w
use CGI;
my $q=new CGI;
my $log = $q->param('log') || 'debug.log';
print $q->header(-type=>'text/plain', -charset=>'windows-1251');
if ($log=~/^([a-z0-1_]+\.log)$/i) { $log = $1 } else { print "Это что за шутки?" and exit 0 }
open FIN, "| cat $log | tail -n 200" or (print "Файл не найден" and exit 0);
print <FIN>;
close FIN;

Комментарий:
Этот скрипт принимает от пользователя через браузер параметр log (имя файла лога), валидирует имя файла лога и отображает 200 последних строк лога на экран пользователю в виде текстового файла. Обновляя страничку можно видеть динамику наполнения лога записями результата работы того или иного скрипта.

System

Все о чем я рассказывал до этого места касается очень маленькой части спектра применения языка – CGI. Попмимо CGI существует еще масса всего, например системы управления целыми серверными площадками, такими как широко известной ISPmanager. WEB интерфейс выполнен с использованием PHP, системы работы с серверными службами и сервисами управляются с помощью связки Perl+C.

В части применения Perl для администраторов имеется хороший, всем известный пример как выполнить команду system "rm -rf /" используя строчку запускаемую через консоль с рутовыми правами (разумеется тем кто работает с языком):

echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

Внимание: не выполняйте этот код – это опасно для Вашей системы!

Комментарий:
Более подробно о команде можно прочитать тут: http://ru.wikipedia.org/wiki/Perl

mod_perl и mod_perl2

По ходу получения навыков работы с CGI скриптами любой Perl разработчик рано или поздно переступит грань между CGI и mod_perl. Интеграция интерпретатора в компонент (модуль) Apache совершила настоящий прорыв в области web-программирования! Такой подход не только ускорил разработку и сделал ее более качественную, но и изменил сознание большинства разработчиков. Те, кто когда-то сделал шаг от CGI к mod_perl однозначно столкнулись с проблемой «многопользовательских интерфейсов с большой нагрузкой». Я не хотел бы тут пропагандировать технологию mod_perl, так как посвящу отдельную статью по этому вопросу. Здесь бы мне хотелось привести часть кода написанном под mod_perl2

sub CLEANUP_CGI_REGISTERS {
    my $r = shift;
    if (CGI->can("VERSION") && CGI->VERSION() < 3.00) {
        if ($r->can("cleanup_register")) {
            $r->pool->cleanup_register(\&CGI::_reset_globals);
        } else {
            eval "use APR::Pool(); 1;";
            if (APR::Pool->can("cleanup_register")) {
                $r->pool->cleanup_register(\&CGI::_reset_globals);
            }
        }
    }
}

Комментарий:
Этот участок кода выполняется для принудительной очистки регистров при использовании старой версии модуля CGI (< 3.00) на фазе выполнения хэндлера InitHandler.

ActiveState

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

ActivePerl

Версия Perl от ActiveState (http://www.activestate.com/) носит название ActivePerl. Продукт полностью интегрируется с Windows и предоставляет весь богатый функционал вплоть до доступа к графическим службам Windows. С помощью ActivePerl можно создавать настоящие кросс-платформенные приложения, например для работы с mod_perl2.

ActiveState Komodo

Программа Komodo открыла мне возможности разрабатывать приложения не допуская синтаксических ошибок, приучила ставить в конце выражений точку с запятой, следить за выравниванием и табуляциями в коде, использовать POD вставки для законченных смысловых блоков и многое другое. Встроенная поддержка CVS позволила интегрироваться с ней не заботясь о статусе проекта вне программы! Немалые возможности программы которые хотелось бы отметить – это средство отладки Perl кода и регулярных выражений, перехват заголовков HTTP запуская CGI сценарий прямо в самой среде и конечно же система отслеживания модульных связей! Все это в целом создает положительное впечатление о продукте.

CVS/SVN

С системами управления версиями мне пришлось познакомиться (как и многим) методом «из-под палки». Но освоив системы я понял, что это отличное средство для того чтобы вести большое количество командных проектов. Хочу рассказать как и в каких ситуациях целесообразно использовать CVS а в каких SVN базируясь на свой опыт их использования:

CVS

Более ранний продукт относительно SVN, но более низкоуровневый.

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

  • есть практически в любой операционной системе Linux/Unix по умолчанию
  • не требует никаких особых условий для работы
  • простой синтаксис команд
  • просто создавать и управлять репозиториями
  • беспрепятственно позволяет вносить в проекты конфигурацию OS

И немного минусов:

  • неудобная работа с кодом написанном под Windows (проблема CRLF)
  • не поддерживается переименование файлов проекта
  • нестабильная работа в случае мешающихся файлов и пустых каталогов

Но, несмотря на это, инструмент был и остается отличным!

SVN (subversion)

Это более поздний продукт, рассчитан на программистов современности. В нем учтено большинство уязвимых мест CVS и сделан акцент на многопользовательские системы разработок. Инструмент более высокого уровня чем CVS, а потому заслуживает применения его на проектах, таких как web-сайты, web-интерфейсы, модули программ и др.

Приведу ряд положительных черт которые мне понравились в subversion:

  • позволяет не зависеть от SSH а работать используя модуль apache
  • хорошо продуман механизм разделения прав
  • отличная система устранения конфликтных ситуаций (коллизий)
  • нет проблемы понимания CRLF в отличие от CVS

И немного минусов:

  • требует установки себя как на клиенте так и на сервере
  • более сложная конфигурация чем для CVS
  • имеется ряд уязвимостей в плане безопасности репозитория

FreeBSD

Операционная система для работы сервера – однозначно FreeBSD! Почему так категорично? – спросите Вы. Ответ пришел не быстро и связан со временем, затраченном на поддержку и установку необходимого программного обеспечения, а также от легкости настройки и совмещения того или иного программного обеспечения.

У меня есть немаленький опыт работы с OS Centos и SLES, но порты FreeBSD – незаменимая помощь в работе! Хотя надо отметить что yum тоже поднялась :) Развернув сервер для своих сайтов на FreeBSD, я неоднократно подтверждал уверенность в правильном выборе (для себя)! FreeBSD, помимо этого, дала мне отличный опыт в работе с:

  • web-сервером Apache
  • прокси-сервером nginx
  • почтовым сервером Postfix (+ dovecot)
  • файрволлом IPFW
  • сервером имен BIND
  • сервером MySQL
  • сервером Oracle
  • SVN и CVS репозиторием

Данные этой статьи будут обновляться и добавляться со временем