Одной из сильных сторон UNIX-систем, в рамках которых и народился Perl, является наличие огромного количества специализированных программ (утилит). Многие из утилит представляют собой компиляторы или интерпретаторы неких языков программирования. К ним относятся, например, язык сопоставления с шаблонами awk2, редактор потоковой обработки текстовых файлов sed и т. Д. Даже программа сборки проектов make построена по этому же принципу. Слов нет, это достаточно удобно. Каждая из программ выполняет ограниченный набор задач, но зато делает это очень хорошо, а кроме того, совместима по входу и выходу с большинством других. В результате гуру из мира UNIX в состоянии решать достаточно сложные задачи путем ввода двух или трех строк с непонятными для непосвященных заклинаниями.
Но в этом же кроется и источник неприятностей.
Системным администраторам приходится овладевать большим количеством узкоспециализированных языков и на лету паять программу, представляющую собой сложный конгломерат из последовательных вызовов до десятка, а то и больше, различных программ. Например, чтобы обработать текстовый файл, системному администратору может потребоваться написать сценарий на языке оболочки bash, в котором осуществляется выбор необходимых строк из файла с помощью программ grep или awk, а затем произвести обработку полученной выборки с помощью редактора sed.
ПРИМЕЧАНИЕ
Можно пойти и другим путем и написать специализированную программу на С, но вряд ли этот путь потребует меньше времени и сил.
Как показывает практика, большинство постоянно возникающих и требующих решения задач, на которые не хочется тратить много усилий, связаны с обработкой текстовых файлов. Возможно, вы не обращали внимания, но текстовыми файлами UNIX пронизан буквально насквозь! И как только этот факт был осознан Лэрри Уоллом (Larry Wall lwallsems.com), на свет появился язык Perl (Practical Extraction and Reporting Language), который был призван упростить решение практических задач, стоящих перед системными администраторами.
В этом языке была предпринята достаточно удачная попытки объединения лучших приемов и особенностей языков С, awk, sed и конечно же bash. Поэтому, имея опыт работы с этими программами, освоить Perl можно без особых сложностей. Например, синтаксис используемых в Perl выражений во многом схож с принятыми в С. А использование идей, заложенных в awk, позволяет исключительно аффективно обрабатывать огромные массивы текстовой информации. При этом стоит отметить, что и с двоичными данными Perl способен управляться достаточно аффективно.
Если вы столкнулись с задачей, в которой требуется использовать не менее трех специализированных программ, или КУМ нужно быстро подготовить прототип программы, то Perl может оказаться наилучшим выбором. Что касается pp-программирования, то здесь позиции Perl сильны по ряду причин. Во-первых, это огромный набор библиотек и модулей, разработанных за последние пятнадцать лет. Во-вторых, это традиции его использования в pplic целях, которые проистекают как раз из того, что первым за создание Интранет-сети в любой организации берется именно системный администратор. И естественно, что предпочтение отдается знакомому инструменту. При этом не стоит забывать, что работа pp-сервера основана преимущественно па выдаче именно текстовых документов, а обработка текстовой информации как раз и является сильной стороной Perl.
Так что в подавляющем большинстве случаев имеет смысл подумать об использовании Perl как базового языка для вашего проекта.
Первая версия программы Perl была написана Лэрри Уоллом в 1986 году. Лэрри в то время работал системным программистом и участвовал в одном из военных проектов, направленном на создание многоуровневых защищенных распределенных сетей. Основная его задача состояла в организации обмена по защищенному каналу (со скоростью 1200 Бод) между двумя сетями из шести машин каждая. Одна из сетей находилась где-то на восточном побережье США, а вторая - на западном. Лэрри приходилось всячески ублажать местных "гуру". Мучаясь над выполнением их пожеланий, он разработал и такие полезные программы, как rn, patch и warp.
Однако злобные капиталисты никак не унимались. В конце концов они потребовали от несчастного Лэрри разработать систему управления всей этой необъятной сетью из шести машин Vax и шести Sun. И на разработку соответствующего программного обеспечения Лэрри был выделен целый месяц! Естественно, что особого желания провести этот месяц за написанием программы с нуля не возникло бы даже у самого трудолюбивого из системных программистов, которые, как известно, от природы ленивы и не хотят удовлетворять насущные нужды пользователей. Поэтому Лэрри решил приспособить для управления трансконтинентальной сетью уже существующие средства - а именно программу рассылки телеконференций В-news.В результате Лэрри установил B-news на трех машинах и добавил две дополнительные команды управления. Согласование версий программ осуществлялось с помощью хорошо известной системы RCS, а ввод и вывод информации осуществлялся, как и следовало ожидать, с помощью команд news и rn. Всякому системному программисту понятно, что этого более чем достаточно для управления почти любой сетью. Однако заказчики Лэрри, демонстрируя алчность и ненасытность акул капитализма, потребовали от него еще и возможности подготовки отчетов! Программа В-news поддерживала хранение данных в нескольких файлах на разных машинах с большим количеством перекрестных ссылок между этими файлами. Первая мысль Лэрри состояла в использовании для подготовки отчетов программы awk. Однако на этом пути его поджидали неожиданные трудности. Awk оказался неспособен эффективно работать с файлами, а именно открывать и закрывать сразу большое количество файлов, имена которых содержались в других файлах, уже открытых для обработки. И, не желая разрабатывать специальную утилиту для решении этой задачи, Лэрри просто-напросто разработал новый язык. Таким образом, в очередной раз была подтверждена истина: "лень - движитель прогресса". Как когда-то колесо было изобретено лентяем, не желавшим спокойно нести груз на себе или волочить по земле, так же и Лэрри Уолл разработал новый язык программирования, не желая спокойно разрабатывать специальную утилиту одноразового применении, как это делали и до него, и после. И за это ему наше огромное спасибо!
Это еще не был тот Perl, который мы знаем сегодня. Даже названия у него еще не было. Лэрри, его друзья, родственники и знакомые перепробовали практически все трех- и четырехбуквенные сочетания английского алфавита, пытаясь подобрать наиболее подходящие.
ПРИМЕЧАНИЕ
Вначале чуть было не устоялось название Gloria, выбранное по имени жены Лэрри, но поскольку в домашнем обиходе его слишком частое упоминание в нередкие для программиста "эмоционально напряженные" моменты и в переговорах по телефону приводило к недоразумениям в семейных отношениях, от него пришлось отказаться.
В конце концов устоялось название Perl, которое деградировало из названия Pearl (жемчужина, англ.). Причиной деградации стала все та же лень - четыре буквы вводить с клавиатуры все лее быстрее, чем пять. И в результате в первоначальном источнике акронима PEARL - Practical Extraction And Reporting Language слово and было превращено в "немой" союз. Да так и осталось немым, похоже, навсегда. В первых версиях Perl отсутствовали многие из привычных сегодня механизмов.
Язык включал только:
Полное описание языка составляло всего пятнадцать страниц. И в то же время Perl работал быстрее, чем awk и sed, и постепенно начал использоваться для решения задач, выходящих за рамки текущего проекта Лэрри.
Спустя некоторое время Лэрри перешел в исследовательский отдел, что расширило его возможности в работе над своим детищем. Постепенно Perl превратился в отличное средство для решения задач системного администрирования. На смену двум стилям работы с регулярными выражениями пришли средства, реализованные Генри Спенсером (Henry Spencer). Чуть позже было добавлено еще несколько полезных вещей, и Perl наконец-то был опубликован в сети Интернет. Что было после этого, представить нетрудно...
Обычно разговоры о преимуществе того или иного языка перед другими носят либо академический характер, либо напоминают кухонную склоку. При этом начнет забывается старая поговорка - "о вкусах не спорят". Однако у Perl действительно имеется несколько привлекательных черт, которые заслуживают упоминания. Конечно, это не единственные основания для то го, чтобы отдать предпочтение тому или иному языку, однако, возможно, именно они могут повлиять на ваш выбор.
Чудно все-таки складывается наша жизнь. Последние десять лет нам усиленно вдалбливали, что "бесплатный сыр бывает только в мышеловке", а в это же самое время капиталисты всего мира разрабатывали огромное количество бесплатных программ - начиная от операционных систем и закапчивая прикладными пакетами, сопоставимыми с традиционно коммерческими системами. Примером такой бесплатной системы является и Perl, который реализован практически во всех операционных системах, включая:
При этом Perl распространяется в соответствии с лицензией GNU, которая предоставляет вам бесплатный доступ как к самой программе, так и к исходным текстам самого Perl. То же относится и к большому количеству библиотек программ и модулей.
Как истинное дитя Интернета, Perl широко представлен в Сети.
Главным источником информации и программного обеспечения является архив CPAN (Comprehensive Perl Archive Network). Откровенно говоря, это единственный узел в Сети, который вам нужен для работы с Perl. Основной узел CPAN находится недалеко от нас по адресу: ftp://ftp.funet.fi/pub/languages/perl/CPAN. Есть зеркало и в России ( www.perl.ru где можно найти интересующую вас информацию), однако на ftp.funet.fi от нас идет практически прямая ветка, поэтому работать с ним - одно удовольствие.
Второй источник Perl-программ и модулей - это компакт-диски, которые периодически выходят в компании Walnut Creek. Вы можете заказать их по сети Интернет (www.cdrom.com) или отыскать в московских магазинах. Удобство состоит в том, что вы получаете сразу все зеркало архива CPAN, а недостаток - в том, что не всегда информация на них оказывается самой свежей.
Perl представляет собой гибрид компилятора и интерпретатора. С одной стороны, вам не нужно использовать отдельный компилятор, чтобы получить исполняемую программу на Perl, - в этом отношении Perl-программа ничем не отличается от сценария на языке оболочки. С другой стороны, Perl все-таки компилятор. Дело в том, что программа вначале полностью компилируется, преобразуется в объектный код, и лишь затем выполняется.
На практике это означает, во-первых, что все синтаксические ошибки выявляются сразу, на начальном этапе работы программы. Это особенно важно для больших программ, которые могут потребовать много процессорного времени для выполнения. Во-вторых, такой код выполняется быстрее, чем при "чистой" интерпретации строка за строкой. Впрочем, интерпретирующая "видимость" Perl имеет свои преимущества. Отсутствие отдельной процедуры для компиляции заметно ускоряет процесс создания программы, что, в совокупности с С-образным синтаксисом языка, создает предпосылки для эффективного использования Perl в качестве средства для разработки прототипов программных средств, которые впоследствии переписываются, например, на C++.
Не случайно начальным словом расшифровки акронима Perl является слово "Practical". С точки зрения разработчика языка Лэрри Уолла это означает, что Perl удовлетворяет трем основным критериям: завершенности, удобству в работе и эффективности. С прикладной точки зрения это означает, что программы на Perl создаются с меньшими непроизводительными затратами на борьбу с различными аспектами технологии программирования, чем при работе с другими языками программирования.
ПРИМЕЧАНИЕ
Надеюсь, вы понимаете, что это относится только к определенному классу задач.
Впрочем, прагматизм состоит не только и не столько в этом. Сила Perl в том, что одна и та же задача может быть решена несколькими различными способами - кому как нравится. Перефразируя классика, можно сказать, что "Perl неисчерпаем также, как и атом". В результате вы можете сосредоточиться на том, что вам нужно сделать, не заботясь особо о том, каким путем вы придете к решению.
Perl представляет собой в какой-то мере избыточное (для обеспечения разных путей практической реализации одних и тек же функций) объединение нескольких языков на основе общего синтаксиса С. В частности, вы найдете отголоски:
Конечно, все эти средства присутствуют в любой UNIX-системе. Но чтобы их эффективно использовать, их необходимо по меньшей мере... изучить на достаточно приличном уровне и иметь опыт работы с ними. А сегодня этим может похвастаться не каждый... В то же время Perl в большинстве случаев оказывается самодостаточным языком, который к тому же легко осваивается. А реализация в Perl 5 объектно-ориентированной модели позволяет легко и быстро наращивать возможности своих программ по мере необходимости. Что очень удобно на практике - изучать приходится только то, что нужно в данный момент.
Удобство в работе означает, прежде всего, тот факт, что на Perl работать удобно.
Можно реализовать одну и ту же задачу различными способами. Я не возьмусь утверждать, что нее эти способы одинаково эффективны с точки зрения использования системных ресурсов, однако в любом случае программист может отдать предпочтение тому способу, который ему более удобен.
Если же эффективность реализации выходит на первый план, вы всегда можете попытаться переписать критичные участки кода по-иному.
Что понимается под эффективностью языка программирования? Как ни странно, но спустя сорок лет после появления первых алгоритмических языков единого ответа на этот вопрос так и не появилось. Поэтому я готов предложить собственное толкование этого термина, а соглашаться с ним или нет - дело читателя. А я полагаю, что эффективность языка программирования - величина, обратная количеству трудозатрат программиста на реализацию той или иной функции. Именно поэтому эффективность того или иного языка в значительной мере определяется задачей.
С этой точки зрения Perl представляется мне исключительно удобным средством для разработки программ, оперирующих с текстом.
Вот стандартная "первая программа", введенная в обиход Керниганом и Ричи в своем бессмертном творении "Язык С":
#include < stdio.h> void main() { printf(" Привет, мир!\n") ; } Ha Perl эта же задача решается так: #!/usr/bin/perl print "Привет, мир!\n"; Но можно и по-другому, если вы не любите управляющих символов, таких как "\n": #! /usr/bin/perl print << "ETEXT"; Привет, мир! ETEXT
В первом случае вы используете наследство, доставшееся вам от Basic, а во втором просто вставляете в свою программу текстовый фрагмент, который без изменений передается в выходной поток данных, то есть на устройство STDOUT. Просто и эффективно!
За пятнадцать лет, прошедших с момента появления Perl, сложилось несколько областей применения, в которых этот язык получил признание и распространение. Рассмотрим области его применения.
Perl значительно облегчает написание процедур, которые изо дня в день приходится выполнять системному администратору. А поскольку в основном дело приходится иметь с текстовыми конфигурационными файлами или текстовыми же файлами системных журналов, то становится понятно, почему в большинстве случаев предпочтение отдается именно Perl.
Как ни странно, но, несмотря на многочисленные попытки вытеснить Perl из этой области или хотя бы предложить какую-либо конкурентоспособную альтернативу, Perl по-прежнему является лидером.
Почему? Да все очень просто! Задача любого CGI-скрипта состоит в том, чтобы обработать текстовый ввод пользователя и сгенерировать опять-таки текстовый документ - HTML-страничку. А средства для работы с текстом в Perl пока еще вне конкуренции.
Еще одна сфера деятельности, оккупированная Perl, - это автоматизация обработки электронной почты, циркулирующей в сети Интернет. Программы на Perl используются для фильтрации потоков почты исходя из ее адреса или содержания писем. Кроме того Perl часто используется для создания автоматизированных систем почтовой рассылки. Одной из наиболее популярных программ, написанных полностью на Perl, является Majordomo,
Понятно, что подготовку CGl-скриптов чаще всего приходится выполнять тем же людям, которые отвечают и за работу всего pp-сервера. Поэтому нет ничего удивительного в том, что и средства администрирования pp-серверов достаточно часто реализуются именно на Perl.
Примером таких средств могут служить средства автоматизированного анализа правильности конфигурационных файлов серверов, аппликаторы системных журналов и т. Д. и т. П.
Еще одна область применения Perl - это автоматизация пакетной обработки информации. Наиболее часто это применяется при конвертации текстовых массивов в базы данных, автоматизации пересылки файлов между машинами на основе протокола FTP и в ряде других задач. Однако в любом случае выбор Perl как средства разработки обусловлен, прежде всего, его возможностями в части обработки текстов.
Выше перечислены достижения Perl за достаточно больший промежуток времени - пятнадцать лет. Но если вы только начинаете изучать этот язык, то, хотя опыт "предков" и бесценен, его можно не повторять с самого начала. В конце концов, закон Архимеда не открывают вновь, а лишь изучают, И пытливому уму это изучение даст только новый толчок. Точно так же обстоит дело и с программированием.
Сегодняшний Perl заметно отличается от первых версий. На какую же основу вы можете рассчитывать сегодня? На чем будут построены шедевры программирования завтрашнего дня? Стоит отметить, что в большинстве книг, посвященных Perl, возможности, которые становятся доступными в результате эффективного использовании Perl 5, не освещаются вообще.
Однако в результате огромной работы, проделанной разработчиками, программы на Perl, которые раньше напоминали просто результат попытки просмотра двоичного файла в текстовом редакторе, теперь стали куда более читаемыми.
Теперь освоить язык и написать на нем понятную программу гораздо легче, чем еще несколько лет назад. Впрочем, полностью сохранена совместимость с прежними версиями, а это значит, что настоящий гуру, как и раньше, может писать таинственные программы, не понятные никому, кроме автора.
В новой версии заметно улучшена обработка ошибок, которая особенно важна при отладке программ. Во-первых, переработаны сообщения о многих ошибках, которые стали более информативными и понятными для начинающего программиста. Во-вторых, в компилятор включено большое количество диагностических сообщений оповещающих о ситуациях, которые могут послужить, а могут и не послужить причиной ошибок времени исполнения.
ПРИМЕЧАНИЕ
По умолчанию режим генерации предупреждений отключен. Однако если вы сталкиваетесь с загадочным поведением вашей программы, вы можете включить его с помощью ключа -w. Это делается следующим образом:
#!/usr/bin/perl -w
... текст программы ...
Возможно, имеет смысл всегда использовать именно эту конструкцию...
В мире UNIX, где родился Perl, существует огромное количество языков программирования. Для облегчения написания компиляторов этих языков в UNIX существует несколько специализированных программных средств, таких как синтаксические и лексические анализаторы. Так вот, в новой версии Perl полностью переписана грамматика языка, и на базе lex и yacc реализованы лексический и синтаксический анализаторы. Ранее использовался "ручной" анализатор, который вел свое происхождение с самых первых версий и за полтора десятка лет приобрел немало недостатков.
В новой версии в результате системного подхода к вопросам определения грамматики удалось на две трети уменьшить количество зарезервированных слов языка. Понятно, что при этом повысилась и производительность анализатора, в результате чего компилятор стал работать быстрее. При этом полностью сохранена поддержка старых программ.
В новой версии переменные могут быть определены в пределах "лексических зон видимости", подобно "auto" переменным в языке С. Это позволяет, во-первых, более эффективно использовать оперативную память компьютера, а во-вторых, облегчить разработку и отладку больших программ.
Ограничения прежних реализаций Perl во многом были связаны с упрощенной, хотя и достаточно гибкой, системой адресации переменных. Реализация ссылки по указателю имелась, но носила рудиментарный характер. А в Perl 5 любое скалярное значение, включая произвольный элемент массива, может содержать ссылку на любую другую переменную или подпрограмму.
Теперь вы можете без проблем создавать анонимные переменные и подпрограммы. Perl автоматически создает необходимые ссылки и поддерживает разнообразные механизмы доступа к ним.
Необходимость в реализации этого механизма возникла при создании и внедрении объектно-ориентированной модели языка.
Практически полностью в новой версии переписана системная библиотека функций и подпрограмм, реализованная в виде набора модулей, которые могут использоваться различными прикладными программами одновременно (ведь мы работаем в многозадачной среде, не так ли?). То же относится и к пакетам. Пакет может импортировать как всю интерфейсную часть модуля, так и его часть. Кроме того, в новой версии определен ряд директив компилятора, которые используются точно так же.
Разработанный прикладным программистом пакет может использоваться как класс или объект. Поддерживаются множественное наследование и виртуальные методы. Для реализации новых функций потребовались незначительные изменения в синтаксисе, которые не повлияли на совместимость со старыми версиями. Зато появилось несколько новых полезных возможностей.
Например, номера каналов ввода-вывода теперь могут рассматриваться программистом как объекты, обладающие своим набором свойств и методов.
Новая версия Perl перестала быть относительно замкнутой, автономной системой программирования. Разработчиками проведена огромная работа по созданию средств сопряжения Perl с другими системами программирования. В результате в состав дистрибутива теперь входит препроцессор xs, который в полуавтоматическом режиме генерирует заголовочные файлы и оболочку функций на С, предназначенные для встраивания функций на С и C++ прямо в Perl.
Поддерживается также механизм динамической загрузки модулей, да и сам Perl может быть при необходимости встроен в динамическую библиотеку,
Небольшим но объему, но достаточно важным нововведением в Perl 5 является модуль PОSIX, который обеспечивает доступ ко всем описанным в стандарте POSIX определениям и процедурам.
При этом, конечно, по мере возможности используются преимущества объектно-ориентированной модели.
Все-таки старый добрый ALGOL еще жив... В новой версии Perl предусмотрено использование блоков BEGIN и END, которые, впрочем, используются не так, как в "дедушке всех языков". Эти блоки предназначены для перехвата управления при старте модуля, после компиляции пакета и при завершении работы программы. Фактически эти блоки выполняют роль конструктора и деструктора пакета или класса, им реализуемого.
ПРИМЕЧАНИЕ
Простейшей аналогией этих блоков служит все же не Алгол (это я приврал для красного словца), а уже не раз упоминавшийся аwk, в котором правила с аналогичными названиями используются до начала и после завершения обработки файла.
В мире DOS и Windows практически неизвестно, что в UNIX для решения задач управления небольшими (до нескольких тысяч записей) пазами данных вовсе не обязательно использовать какие-либо СУБД. В состав стандартных библиотек в любой версии UNIX обязательно входит та или иная реализация библиотеки DBM (Data Base Management).
Конечно, множественность миров UNIX привела к тому, что сегодня существует несколько версий этих библиотек, каждая из которых использует одни и те же системные вызовы, но отличается форматом дисковых файлов. Новая версия Perl позволяет одновременно использовать большую их часть, а именно: DBM, NDBM, SDBM. GDBM и Berkley DB файлы. Достигнуто это за счет пересмотра старого вызова dbmopen, который теперь в случае необходимости вы можете расширить для обработки собственных форматов!
Новый механизм, получивший название AUTOLOAD, позволяет нам фактически определить любой механизм разрешения или замещения вызова подпрограмм, которые не определены в программе.
Вы можете либо попытаться автоматически найти соответствующее определение на дисковых файлах и загрузить их, либо вызывать собственную подпрограмму, которая попытается проанализировать причины ошибки, либо просто вывести сообщение об ошибке.
Было бы наивно утверждать, что Perl 5 появился всего месяц или два назад и представляет собой абсолютно новую систему. Этой версии уже около пяти лет, и в настоящий момент она достаточно стабильна. В результате для нее разработано огромное количество модулей и программ, которые находятся в архиве CPAN в сети Интернет.
Я охотно допускаю, что мои заявления относительно того, что Perl является компилятором, а не интерпретатором, могут вызвать ряд возражений. Однако на сегодняшний день существует и отдельный транслятор perl-to-C.
Эта программа позволяет скомпилировать исходную программу на Perl, сгенерировав при этом переносимый байт-код, обычный код на С или оптимизированный С-код. Однако в состав стандартного дистрибутива эта программа не входит, и вам потребуется самостоятельно выгружать ее из CPAN.
Perl представляет собой компактный, простой в изучении язык программирования, который предназначен для решения задач, связанных с обработкой текстовой информации. Как и любой другой язык программирования, Perl не может претендовать на роль единственного языка в арсенале средств современного разработчика системного и программного обеспечения, однако относится к тем средствам, владеть которыми крайне желательно.
Как известно, недостатки являются продолжением наших достоинств. Отсутствие Perl в большинстве академических курсов связано с одним из них. Поскольку один и тот же результат в Perl достигается разными способами, то среднестатистическому преподавателю довольно сложно и разъяснить, какой из них наиболее эффективен в данном конкретном случае, и проверить несколько десятков работ, выполненных в различных стилях. Надеюсь, что этот труд поможет, в конце концов, поставить учебные курсы по Perl и у нас.