Perl’овка в домашнем хозяйстве
 
16.09.2003
Илья Щуров Voyager


 
стр. 1
стр. 2 >>

Все началось в далеком 1987 году, когда программисту Ларри Уоллу надоело вручную делать то, что можно автоматизировать. Так и появился язык Perl, предназначенный для обработки всевозможных log-файлов, извлечения из них полезной информации и прочих нужд сисадмина юниксовой машины. В дальнейшем он развился в нечто большее, а с приходом Интернета завоевал огромную популярность как язык написания cgi-скриптов — форумов, гостевых книг, голосований и прочих элементов интерактивности веб-сайтов. Для рядового программиста слова «Perl» и «cgi» стали практически синонимами, и большинство статей на эту тему посвящено именно веб-разработке. Многие пользователи Windows даже не догадываются, что Perl можно использовать как-то иначе. А зря! Это очень удобный инструмент, способный упростить жизнь во многих областях, даже далеких от сайтостроительства. Главное — творческий подход.

Философия

Perl — язык со странностями. Это отмечает и его автор, расшифровывая название как «Patologically Eclectic Rubbish Lister» (дословно: Патологически Эклектичный Мусорный Листер) вместо официального «Practical Extraction and Report Language» (Практичный язык для извлечения информации и составления отчетов). Если знакомиться с Perl’ом после освоения С/C++, станет немного не по себе, если же учить его в самом начале программистского пути, будет еще хуже — приобретете кучу дурных привычек, ибо, объединив в себе элементы множества других языков, Perl немного противоречив и не похож ни на что другое. Однако в этом есть и своя прелесть.

Содержание руководства по Perl, запускаемого командой perldoc.Perl призван максимально облегчить жизнь разработчика, поэтому очень многое из того, что программист на С привык делать «руками», здесь происходит автоматически. Надоело преобразовывать переменные из строкового типа данных в числовой и наоборот? Нет проблем — в Perl’е они вообще не отличаются: все «обычные» переменные (не являющиеся массивами, файловыми дескрипторами и т. д.) имеют один и тот же тип — скалярная величина. Строка «12» может выступать в роли числа 12 и наоборот. Не надо следить за распределением памяти — если оперативной памяти достаточно, можно скопировать хоть содержимое всего Интернета в одну переменную, и не будет никаких «ошибок переполнения буфера» и связанных с ними дыр в безопасности, столь любимых хакерами всех мастей. С массивами тоже все хорошо: они меняют свой размер не менее автоматически, чем строки, и еще одной головной болью становится меньше. Хеши (или ассоциативные массивы) — это вообще сказка, ставшая былью: возможность создания наборов переменных, в которых элементы индексируются не номерами, а произвольными строками, оказалась столь удобной, что вся объектно-ориентированная часть языка построена именно на них. По сути, хеши частично заменяют структуры языка C.

Особый разговор о регулярных выражениях. Повергающие в ужас участки кода, вроде $str=~s/(\S{70})(\S+)/$1 $2/g; оказывается, являются не только нечитаемым набором символов, но и весьма удобным инструментом, позволяющим делать с текстом все, что только поддается формализации, и даже чуть больше. Если коротко, то регулярные выражения — просто средство поиска и замены участков строк, удовлетворяющих определенным шаблонам. Однако шаблоны эти могут иметь довольно сложную структуру и определять весьма нетривиальные подмножества строк. Скажем, регулярному выражению /(http:\/\/|www.)([a-zA-Z0-9-] +\.)+[a-zA-Z0-9-]{2,4}/ будут соответствовать адреса сайтов, начинающиеся с http:// или www., содержащие в себе только разрешенные символы и заканчивающиеся двух-, трех- или четырехбуквенной доменной зоной. Более того, при замене можно ссылаться на найденный текст или его участки — так, команда s/(\w+) (\w+)/$2 $1/ меняет местами пару слов, разделенных пробелом. Однако хватит о регулярных выражениях — о них написаны целые книги (например, [2]), и углубляться в подробности я не могу — места в журнале не хватит.

Регулярные выражения: выглядят страшновато, но работают.Во многих случаях забота о программисте в Perl’е оказалась чрезмерной. Например, отсутствие необходимости объявлять переменную перед ее использованием приводит к тому, что одна опечатка может вылиться не в сообщение об ошибке, как в C, а во многие часы отладки. Вместо того чтобы поругать невнимательного программиста, как делают другие языки, когда встречают неизвестный ранее идентификатор, Perl послушно создаст новую переменную и инициализирует ее нулем или пустой строкой (в зависимости от контекста). Понятно, что если появление такой переменной — результат опечатки, то это вряд ли входит в планы разработчика, и искать подобную ошибку придется долго. Это же относится к ряду других вещей. Впрочем, можно попросить Perl быть построже, использовав команду use strict; в самой программе и ключ -w при запуске интерпретатора — именно так рекомендуют поступать абсолютно все виденные мною руководства. Пожалуй, стоит прислушаться: усилия, затраченные на самоконтроль, многократно окупятся временем, сэкономленным на отладке.

Еще одна вещь в Perl’е, от которой у программиста с опытом работы на «обычных» языках может случиться удар — это реализация объектно-ориентированного подхода. Как такового понятия «объект» здесь вообще нет, но есть хитрым образом сконструированная его замена1. Наследование, конструкторы, деструкторы, методы и прочие атрибуты ООП — в наличии, хотя и в не совсем обычном виде. Гораздо хуже с такими вещами, как защищенные (private или protected) методы и поля данных. Они просто отсутствуют. Существуют некие соглашения о том, какие методы вызывать можно, а какие — лучше не надо, но ничего похожего на строгие правила C++ и других языков нет. Также нет никаких средств контроля типов данных. Ужас, одним словом. Но — к этому можно привыкнуть и даже полюбить.

Увы, я уже не успеваю рассказать о списках и связанных с ними контекстах, интерполяции, «умолчальных» переменных ($_ и @_), символических ссылках и многом другом. Perl — язык богатый и необычный, у него есть сотни или даже тысячи нюансов, которые можно почувствовать, только имея достаточный опыт работы. Впрочем, для применения в «домашних условиях» знать их совсем не обязательно.


1 (назад)Речь идет о Perl 5. Готовящийся к выходу Perl 6 будет полностью объектно-ориентированным языком, но это уже другая история.


 
стр. 1
стр. 2 >>

<<Два постскриптума
Все материалы номера
Сериалу — параллельно >>