Основы языка perl. Основы Perl — строки, числа, массивы, хэши

Все нижесказанное ни в коей мере не претендует на полноту и достоверность.

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

Эту статью я решил написать, после того как узнал насколько сложно "врубиться" во всё, даже если у вас есть под рукой какое либо пособие по PERL. Везде, уже в самом начале, начинают ссылаться на какие-то загадочные термины и команды, а вам остаётся только удивлённо хлопать глазами, или (если вы всё же что-то поняли) заставить эти программы работать (не "как надо", а вообще!). Эту статью можно было бы назвать "PERL для чайников", если бы она охватывала весь материал, но здесь я ставлю перед собой цель дать вам лишь необходимые начальные понятия, и так сказать "подготовить к дальнейшим сражениям":). Хотя вполне возможно, что в дальнейшем, "по просьбам трудящихся", эта небольшая статья разрастётся в нечто большее.

Итак... начинаем!

Для начала сообщу вам, что PERL необходимо установить на ваш компьютер. Эту, казалось бы, простую операцию некоторые мои знакомые начисто пропускали, а после, написав простенькую программу, долго пытались её запустить... ;) Наиболее доступный пакет PERL (на мой взгляд) - это ActivePerl, хотя, этот пакет ориентирован на пользователей Windows, а если у вас UNIX, то можно скачать что нибудь родное с www.perl.com. Так или иначе, вы достанете и поставите себе perl (если уже этого не сделали). Так вот: у вас появится новая папочка "perl", но это вовсе не значит, что все проги нужно помещать именно туда:) Perl, там сидящий, лишь исполняет все ваши гениальные творения с расширением *.pl , а уж где они сами находятся - одному юзеру известно:) (справедливо для пользователей windows с установленным пакетом ActivePerl, т.к. он ассоциирует файлы *.pl).

Т.к. как эта статья рассчитана в первую очередь на пользователей windows, то считаю себя обязанным рассказать вам, что для программ, исполняемых в этой операционной системе вовсе не обязательно начинать каждую программу со строки:

#!/usr/bin/perl

Всё дело в том, что язык этот создавался на базе ОС UNIX, а эту строку нам пытаются передать в "наследство" от их операционки. Однако вам следует помнить, что на сервере (если вы решите скинуть туда свои проги) может стоять и UNIX.

Теперь немного о методе написания.
Советую вам для начала использовать простой блокнот, чтобы запомнить все команды и синтаксис программирования. В дальнейшем, можно использовать какой нибудь редактор, но это уже не спортивно:), и уж тем более нежелательно для тех, кто только знакомится с этим языком программирования, да и программированием вообще.

Практически все руководства по этому языку начинаются с самой простой программы, которая выглядит примерно так:

print ("hello, WORLD!\n");

Некоторые из вас уже, наверное, скопировали приведенную программу в свой файл и заметили, что она быстренько открывается и также быстро закрывается. Это связанно с тем, что программа есть программа, и после того как она выполнится - сразу же закроется, поэтому добавьте к программе ещё одну строку с следующим содержанием:

В итоге всё это примет следующий вид:

print ("hello, WORLD!\n");
<>;

Не так уж и просто выглядит для непосвященного... Даже немного пугающе... Но это только для непосвященных, на самом деле всё - проще некуда! :) Не верится? Сейчас докажу.
Во-первых, вам нужно узнать, что print - это команда, которая выводит информацию на стандартный вывод STDOUT (STanDart OUT или, проще говоря - вывод на монитор).
Во-вторых, непонятность в виде \n - это переход на новую строку (newline), но не программы, как могли бы испугаться некоторые, а информации на экране, т.е. если бы вы продолжили бы текст, заключенный в кавычки, то после этого символа он был бы напечатан с новой строки. А если вам понадобилось бы в самом тексте использовать обратный слеш (шелс:), то перед ним надо поставить еще один шелс. Например:

print "\a"; #Команда, после которой Perl #выведет сигнал на SPICER print "\\a"; #Perl просто выведет на экран \a

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

$a = "hello, world!"; #Присвоить переменной $a некий текст
$b = 777; #Присвоить переменной $b некое число

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

$abc = "123"; #Число в строке
$123 = 123; #Число как таковое

Если вам нужно для вычислений число, то просто не ставьте двойных кавычек.

Точка с запятой в конце каждой строки - это собственно... конец строки, из чего следует, что вы можете написать всю программу в одну строку, но нам что - строк жалко что ли:) Из выше сказанного есть исключение: знак # говорит о том, что всё, что есть в строке после него - это комментарий, и к программе уже не относится.
Знак ромб <> - это по умолчанию или, говоря понятным языком - стандартный ввод с монитора (разъясняю: на мониторе появляется запрос, а вводите вы конечно же через клаву. Потом нажимаете ентер и введенное значение уже в переменной Perl, если она была задана). Вся хитрость добавления этого ромба в нашем случае в том, что он будет запрашивать у вас этот ввод, пока вы не нажмете кнопку "enter", а так как в программе не указанно, что делать с этим вводом, то perl о нём просто забудет и станет считать нашу программку завершенной. И врезультате выполнения этой программы мы с вами увидим на своих мониторах текст Hello, world! .

Теперь немного усложним нашу программку:

print "enter your name: ";
$name = <>;
print "hello $name!";
<>;

Вам следует уяснить, что программы выполняются построчно, т.е. сначала первая строка, после неё вторая и т.д..

Итак, в первой строке мы выводим предложение ввести имя пользователя. Во второй строке мы его считываем в переменную $name. $name - это, как уже говорилось, скалярная переменная Perl, которая начинается знаком доллара. Забегая вперёд, скажу вам, что кроме переменных, начинающихся с доллара, бывают также массивы (@массив), хэши (%хеш), и ещё несколько видов, о которых пока рано рассказывать. Между переменной и ромбом стоит равенство, это значит, что мы присваиваем переменной результат запроса. В третьей строке мы выводим слово hello, а после него выводим то, что хранилось в переменной $name. В нашем случае это имя, которое мы просили ввести.

Сделаем ещё одно отвлечение, в котором я расскажу вам, что можно делать с переменными... С ними можно делать ВСЁ! И это не преувеличение. Например, возможно такое:

$a = 3;
$b = 4;
$c = $a+$b; #Сложить две переменные и
#присвоить их третьей
print $c; # Вывести получившееся число
print $a+$b; # тоже самое, только без
# привлечения третьей переменной

Надеюсь с этим всё понятно... А пока до некоторых доходит, мы напишем программку, которая выполняет команды ДОС dir. Для тех кто не знает - dir - команда выводящая на экран содержимое директории в которой вы находитесь.

$dos = `dir`;
print $dos;
<>;

Эта программка считывает в переменную $dos результат выполнения команды dir, которая заключена в обратные кавычки, (если бы это были простые кавычки, то получилась бы не команда, а просто слово) после чего выводит на монитор этот самый результат.

Теперь так сказать вернёмся к нашим баранам, вернее пока лишь к барашкам:) Мы научились выводить на экран необходимый нам текст, получать информацию от пользователя, а так же узнали, что ДОС команды в обратных кавычках будут выполняться как ДОС команды:) Самое время написать программку, которая будет запрашивать не что иное, как эти самые команды:

print "enter comand: ";
chmod($com = <>);
print `$com`;
<>;

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

Выгадываем мы этим всего несколько символов, но ведь всё равно приятно:)

На этом считаю, что первые шаги вы прошли и готовы продолжить тернистый путь изучения Perl.

Данная статья написана для людей, которым в силу непреодолимых обстоятельств приспичило срочно изучить Перл. Для меня таким обстоятельством стало то, что мой компьютер стал WEB-сервером, а я, соответственно, WEB-мастером. Учиться принято на чужих ошибках и опыте, поэтому предлагаю Вашему вниманию свой опыт изучения Перла.

Сразу нужно пояснить, для кого это все написано. Если Ваш сервер работает на платформе UNIX, то это я должен читать Вашу статью. У меня же установлен Windows NT workstation 4.0 (RUS) плюс Service Pack 3. Когда пришло время сделать из компьютера WEB-сервер, я было кинулся ко встроенным Службам узла WEB, но быстро понял, что это мне не нравится (почему?). И тут один добрый человек посоветовал поставить Xitami WEB Server от iMatix Corporation (), который и стоит по сей день.

Что касается самого Перла, то здесь несколько сложнее. Покопавшись по различным Перловым серверам (www.perl.org , www.perl.com) я узнал, что версий Перла настолько много, что выбрать что-нибудь конкретное довольно сложно. При этом каких-нибудь вразумительных рекомендаций по поводу выбора той или иной версии нигде нет. Перепробовав почти все версии для Windows, я остановил свой выбор на Active Perl ().

Человеку, избалованному всякими Виндовозами и Дельфями, писать программы на Перл довольно непривычно, поэтому настоятельно рекомендую сразу установить Perl Builder. Взять его можно на www.solutionsoft.com. Там лежала тридцатидневная Демо версия.

Ну, думаю, пора переходить непосредственно к делу. В общем случае, скрипт на Перл, как и любая другая программа, работает так:

  1. получает данные
  2. обрабатывает данные
  3. выдает результаты

Передать данные скрипту можно двумя методами - GET и POST. Разница между ними в том, что при использовании GET данные постоянно болтаются в строке адреса браузера, напимер:

Httр://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta

В этом случае скрипт B_price.pl берет данные в переменной окружения QUERY-STRING.

$data=$ENV{"QUERY_STRING"};

При использовании метода POST данные передаются на стандартный вход скрипта. Длинна блока данных берется в переменной CONTENT_LENGTH:

Read(STDIN,$data,$ENV{"CONTENT_LENGTH"});

Теперь эти данные нужно перевести в удобоваримый вид, поскольку они закодированы.

Стандартным соглашением служит замена пробелов знаками плюс и затем кодировка оставшихся недопустимых символов с помощью ASCII-кодов в шестнадцатиричной форме, перед которыми ставится знак (%). Пример:

Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl\ ?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3

Это значит:

Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?\ Category=Видео&Description=абвг

Декодировать строку запросов в первый раз лучше самому. На вопрос "а как?" есть множество ответов, переписывать которые нет смысла. Приведу лишь короткий пример:

Заменяем знаки (+) на пробелы

$query = ~ s/\+/ /g;

Потом заменяем все сочетания знака (%), после которого следуют шестнадцатиричные цифры, на соответствующий символ ASCII

$query =~ s/%({2})/pack("C", hex($1))/eg;

Я пользуюсь тем, что предлагает Perl Builder:

#! E:\perl5\bin\perl &GetFormInput; # вызов подпрограммы получения данных $Category = $field{"Category"}; # получаем данные из поля Category $Description = $field{"Description"}; # получаем данные из поля Description $Page = $field{"Page"}; # получаем данные из поля Page

В конце скрипта помещаем подпрограмму "прозрачного" чтения данных.

Sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{"REQUEST_METHOD"} eq "POST") { read(STDIN,$buf,$ENV{"CONTENT_LENGTH"}); } else { $buf=$ENV{"QUERY_STRING"}; } if ($buf eq "") {return 0;} else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(..)/pack("c",hex($1))/ge; $name=~tr/+/ /; $name=~ s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; #if you want multi-selects to goto into an array change to: #$field{$name} .= "\0$val"; } } } return 1; }

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

И, наконец, Вам нужно выдать какие-то результаты броузеру клиента, причем так, чтобы броузер правильно их отобразил. То есть, выдавать результаты нужно в HTML. Это делается просто: (тоже можно по-разному)

Print "Content-type: text/html", "/n/n"; #обязательная строка print "

В поле Category Вы ввели: ", $Category, "

Все это касается скриптов, получающих данные из формы на странице HTML. При этом страница с формой - отдельно, скрипт - отдельно. Можно сделать красивее и удобнее: объединить страницу и скрипт в единое целое. Для этого скрипт пишется по схеме:

  1. При первом запуске скрипт рисует HTML страницу с формой и ссылкой в тэге ACTION на самого себя. Первый запуск определяется по отсутствию входных данных.
  2. Если входные данные есть, то получаем их, обрабатываем и выдаем результаты.

#! E:\perl5\bin\perl if (($ENV{"QUERY_STRING"} eq "") or ($ENV{CONTENT_LENGTH}=0)) { # генерируем страницу с формой } else {# получаем данные, обрабатываем и выдаем результат}

Гостевая книга

Общий алгоритм работы гостевой книги таков:

1. Если посетитель хочет сделать запись в книгу, то
1.1 Получаем данные
1.2 Записываем их в файл или в базу данных
1.3 Говорим спасибо на HTML и предлагаем почитать другие записи
2. Если посетитель хочет почитать записи в книге, то
2.1 Читаем записи из файла или из базы данных
2.2 Выводим их красиво в HTML

Для удобства восприятия я оформил пункты 1 и 2 отдельными скриптами add_guestbook.pl и read_guestbook.pl соответственно. Сообщения гостевой книги хранятся в текстовом файле построчно, т.е. на каждую запись - строка. Так сделано для удобства чтения этого файла. Пример одной записи:

Sat Dec 5 13:31:20 1998&Наташа&студентка&Good&Для начала хорошо. Успехов на данном поприще Вам, Александр!&нету@пока&194.226.60.34

Вот описание полей рассматриваемой гостевой книги.

  • Name - имя, фамилия, отчество, кличка - на усмотрение посетителя
  • Work - профессия, род занятий
  • RadioButton - три кнопки: понравилось (Good), не понравилось (Bad), пофигу (Different)
  • Text - text box комментариев и примечаний
  • Email - обратный адрес

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

Вы владеете какими-либо другими языками программирования? Если да, то изучение Perl будет для вас просто удовольствием. Если же нет, то не спешите, пробуйте все предлагаемые упражнения и примеры и не бойтесь экспериментировать!

Происхождение

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

Одна из причуд языка - его название. Оно имеет несколько определений. Первоначально Perl означал Practical Extraction Report Language (практический язык извлечений и отчетов). Однако, программисты очень часто называют его Phatologically Eclectic Rubbish Lister или даже Practically Everything Really Likable.

Давайте посвятим несколько минут тому, чтобы разобраться, что представляет собой Perl, и какие задачи возлагались на него во времена его создания. В далеком 1986 году Larry Wall работал над задачей генерирования отчетов из большого количества текстовых файлов, пересекающихся друг с другом. Будучи Unix-программистом, а также, потому что задача включала в себя манипулирование содержанием текстовых файлов, он первым делом попытался использовать Awk. Но вскоре стало ясно, что Awk для работы не подходит, и, не имея других кандидатов для решения поставленной задачи, оставалось только изобретать свой собственный инструмент, который можно было бы использовать и в будущем.

Вместо того чтобы впустую тратить время, Larry просто изобрел новый язык программирования и написал интерпретатор для него. Это похоже на парадокс, но это не совсем так, - то, что вы делаете - это всегда большой труд, но если вы сделаете это правильно, то этот труд обязательно окупится.

Вскоре Larry предложил свое детище сообществу читателей материалов телеконференций Usenet. Пользователи, имеющие доступ к Usenet, обеспечили создателю Perl эффективную "обратную поддержку", спрашивая, как делать одно, другое, третье. Многие из этих задач Larry даже и не собирался ставить перед своим маленьким новым языком программирования.

Новый язык программирования имел акцент на управление системой и обработку текста. После нескольких пересмотров он уже мог использовать регулярные выражения, сигналы, а также сетевые сокеты. Он стал известен как Perl и очень быстро сделался популярным в среде Unix-программистов, а вскоре и у всех нас.

Larry уже не сопровождает Perl в одиночку, но сохраняет свой эксклюзивный титул главного разработчика.

Perl-программы очень похожи на Си-программы, - возможно, потому что Perl был написан на Си, а, возможно, потому что Larry нашел удобными некоторые конструкции Си. Но Perl менее педантичный и гораздо более лаконичный, чем Си.

Perl призван помочь программисту в выполнении рутинных задач, которые для shell слишком трудны или плохо переносимы, а для Си (или любого другого языка) - слишком заумны или сложны в кодировании.

Когда вы освоите Perl, вы, возможно, обнаружите, что стали тратить заметно меньше времени на правильное заключение в кавычки различных параметров shell (или на корректное выполнение Си-объявлений), а больше - на чтение Usenet-новостей и катание с гор на лыжах, потому что Perl - замечательное средство для вашего совершенствования как программиста. "Кто-то из древних" сказал: "Не стОит изучать язык программирования, который радикально не меняет вашего представления о программировании". Будьте уверены - изучив Perl, вы посмотрите на программирование с совершенно иной точки зрения.

Мощные конструкции этого языка позволяют создавать с минимальной затратой сил очень эффективные решения и универсальные инструменты. Эти инструменты можно использовать и в дальнейшем, потому что написанные на Perl программы отличаются высокой переносимостью и готовностью к использованию. В результате у вас появится еще больше времени для чтения Usenet-новостей и посещения с друзьями баров.

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

Стоимость и лицензия

Perl свободен. Если быть более точным - Perl распространяется по открытой лицензии GNU (GNU Public License). Полный исходный код и документация абсолютно свободны для копирования, компилирования и печати. Все программы, написанные вами на Perl - ваши, и вы можете делать с ними все что захотите.

Помимо UNIX-компьютеров, Perl также существует для других платформ, - Windows, DOS, Atari, Amiga и.д.

Проинсталлирован ли у вас Perl?

Очень легко узнать, есть ли у вас Perl. Просто дайте в командной строке следующую команду:

perl -v This is perl, version 5.001
Unofficial patchlevel 1m.
Copyright 1987-1994, Larry Wall Win32 port Copyright 1995 Microsoft Corporation. All rights reserved.
Developed by hip communications iNC., //info.hip.com/info/
Perl for Win32 Build 107
Built Apr 16 1996@14:47:22
Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5.0 source kit.

Если же вы получили сообщение об ошибке или у вас Perl четвертой версии, то обратитесь к вашему системному администратору или же установите Perl сами.

Ваша первая программа на Perl

Ваша первая программа на Perl иллюстрирует вывод строки текста на экран. Для начала вы должны создать простой текстовый файл, в котором будет содержаться ваша Perl-программа. Затем вы запустите файл с вашей программой.

Создание программы

Perl-программа представляет из себя обычный текстовый файл, содержащий несколько конструкций языка. Последние обычно напоминают смесь из Си, Unix shell script и английского языка. В общем-то, именно так оно и есть на самом деле.

Perl-код может быть достаточно разнообразным. Вот несколько основных правил:

Ведущие пробелы в строке игнорируются. Вы можете расположить оператор языка, где захотите: в начале линии, с отступами (рекомендуется) или даже выровнять по правому краю (но в таком случае читать текст программы и что-либо понять будет крайне трудно);

Конструкция языка должна заканчиваться точкой с запятой, за исключением случаев, когда данная конструкция является последней в блоке или файле, или это - оператор eval;

Пробелы, табуляция, пустые строки иррелевантны, - один пробел также хорош, как сто таких же пробелов. Это означает, что вы можете разбивать конструкцию языка на несколько строк для ясности. Строка - это обычно серия символов, заключенных в кавычки. Глава 2 "Числовые и строковые литералы" содержит более подробное описание строк;

Все что следует за символом "#" игнорируется, если только это не внутри какой-либо строки. Используйте эту возможность для обеспечения вашего кода полезными комментариями. Надо отметить, что многострочных комментариев (например, как в языке Си) в Perl нет.

Аналогично shell-скрипту, Perl-программа состоит из всех операторов Perl, имеющихся в файле и рассматриваемых в совокупности как одна большая программа, подлежащая выполнению. Понятия main-функции, как в Си, в Perl нет.

Это важное событие в мире программирования произошло в 1986 году, когда обычный на первый взгляд парень Ларри Уолл после кропотливой работы объявил миру, что разработал язык программирования Perl. Путь к этому знаменательному событию оказался трудным и тернистым, но результат того стоил. Как, кто и зачем разработал новый язык программирования? Здесь есть ответы на все эти вопросы.

Предыстория

Толчком для этого открытия послужила Тогда он принимал участие в проекте UNIX. Работа была сложная, так как необходимо было создать безопасную сеть со многими уровнями, чтобы была возможность объединить работу нескольких компьютеров, работающих друг от друга на значительных расстояниях. Весь процесс был выполнен успешно, но вот отчеты пришлось делать очень трудоемкие, не только с огромным количеством файлов, но и с между ними.

Уолл решил применить для работы фильтр awk, но возникло неожиданное препятствие: невозможно было управлять ни открытием, ни закрытием огромного числа файлов - по иронии - на основе в них же содержащейся информации о расположении этих файлов.

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

Вот потому талантливый системный администратор, по образованию лингвист, что помогло ему в работе, рискнул и создал язык программирования Perl, чтобы была возможность одновременно обрабатывать текстовые файлы, находить решение для системных задач, создавать более понятные отчеты. И в то же время чтобы это было низкоуровневое программирование, которое являлось бы доступным на языке С. Потому интерпретатор языка Perl и был написан на нем.

Новый язык программирования: причина возникновения

Как утверждал Ларри, помогла ему создать новый язык лень. Но именно та лень, которая позволила решить важную задачу: как избежать составления многочисленного числа программ на разных языках, которые были неотъемлемой частью инструментальных средств UNIX. Слишком утомительной была такая процедура.

Достоинство нового языка оценили другие, так как в нем гармонично сочетались возможности обработки файлов и системного администрирования. А это именно два необходимых факта, которые нужны во время программирования системы UNIX.

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

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

Особенности

В переводе на русский язык аббревиатура Perl звучит как «практический язык, чтобы извлекать данные и составлять отчеты».

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

Почему новый язык сразу оценили многие пользователи, есть много причин. Кто пользуется системой UNIX, знает, что настройки здесь проходят через специальные файлы - обычные текстовые, а изменения осуществляются после выполнения команд. Они написаны на особом языке оболочки, а их выполнение происходит из командной строки.

Система UNIX позволяет создавать индивидуальные команды, опираясь на команды интерпретатора и сохраняя их. Они остаются в текстовых файлах, и если требуется, выполняются как стандартный набор команд операционной системы - только через командную строку.

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

  • Awk. Программа дает возможность сопоставлять с данными образцами и служит генератором отчетов.
  • Sed. Выступает как пакетный редактор для текстовых файлов.

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

Большие возможности

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

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

Язык прижился и полюбился за легкость использования, сейчас его признают как самый динамический язык программирования. Он поддерживает разнообразные парадигмы, куда входят стили - функциональный, процедурный и другие, у него имеется контроль за памятью, есть поддержка обработки текста.

Не зря один из девизов Л. Уолла гласит, что вещи простые могут оставаться простыми, но сложные обязаны выполняться.

Освоить язык несложно, разобравшись в выражениях присваивания, блоках кода, управляющих структурах и функциях.

Схожесть c другими языками

Ларри многое позаимствовал из других языков программирования. Например:

  • Командные оболочки UNIX. Переменные маркированы ведущими знаками, они четко выражают тип переменной и помогают этим переменным являться в строках интерполированными. Встроенные функции обеспечивают инструментарий, а он используется для программирования оболочки.
  • Массивы из Лиспа.
  • Использование Perl регулярных выражений из awk , заодно позаимствовав от него ассоциативные мотивы.
  • Из sed.

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

Уолл почерпнул у Г. Спенсера пакет, который помог освоить Perl регулярные выражения, модифицируя его под свое детище. Многие разработанные функции - заслуга не только Ларри. Коллеги и друзья не менее увлеченно старались привнести в разрабатываемую уникальную программу свои новшества. А когда язык появился в интернете, образовалось целое сообщество единомышленников, которые тоже помогли его усовершенствовать. В работе задействовано с тех пор, как утверждает статистика, более 10 000 программистов.

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

Этапы развития

Небольшие, но значительные этапы пути можно выделить в таблице.

Выпускаемые версии

Время создания

perl 1. Много возможностей не содержала. Это был самый простой способ поиска в файлах по шаблонам. Но имелись дескрипторы файлов, формат и скалярные переменные.

1988 год. Январь.

perl 2. Появился пока еще не усовершенствованный механизм регулярных выражений.

1988 год. Июнь.

perl 3. Разработчики добились возможности обработать потоки двоичных данных.

1989 год. Октябрь.

perl 4. Появилась по большей части благодаря книге, увидевшей свет, «Programming Perl», но под названием больше известным, как «Верблюжья книга». Закрепил документировано новый язык. Этот период прошел целую серию релизов, в результате остановившись на версии 4.036. Это был уже 1993 год. Тогда началась работа над следующей - V - версией.

1991 год. Март.

perl 5. Появилась поддержка сложных типов данных, объектная модель, что включает в себя ссылки, пакеты, а также замыкание в качестве значения. Создается список рассылок, чтобы можно было координировать работу на разные платформы. По сути, это явилось главным форумом по разработке, портированию и обслуживанию. Модули теперь являются с важной частью версии, ведь они смогли расширить язык, но без участия модифицирования интерпретатора. Это смогло его стабилизировать, однако расширило языковые возможности.

1994 год. Октябрь.

Уникальный Perl - язык программирования: плюсы и минусы

Perl 5 активно разрабатывается и теперь, пополняясь все новыми версиями. Но все разработки роднит несколько факторов: выполняется автоматическая типизация данных, проводится автоматический контроль над памятью.

Благодаря интерпретатору известны не только типы, но и запросы памяти каждого объекта программы, и ему не составляет труда распределить память, освободить при подсчете ссылок.

Нужно отметить, что Perl-программирование отличает интерпретатор от других. Доказательством тому являются трансляция программы в промежуточный байт-код, а уже потом начинает выполняться. В сравнение: традиционный работает немного иначе - вводимый оператор интерпретируется и мгновенно выполняется, что чревато синтаксическими ошибками во время рабочего процесса. Perl позволяет обнаружить такого рода ошибки уже в период трансляции в бай-код.

Для того чтобы перевести один вид данных в другой, потребуется автоматический процесс, если же невозможны переводы каких-либо видов данных, это может привести к роковой ошибке.

Заслуга версии 5 004 в том, что здесь имеется пакет UNIVERSAL, который языку дал основной объект, а от него произошли все классы - на автоматической основе. Появилась возможность запросить версию модулей. Стало реальностью поддерживать запрашивать версию модулей. В дополнение к этому perl стал поддерживать многие операционные системы, и Microsoft Windows в том числе.

Версия 5.005, вышедшая в 1998 году, значительно повысила качество процессора регулярных выражений, улучшила новые перехваты в бэкенд, что решилось с помощью определенных модулей и расширила поддержку операционных систем.

Последние обновления

Двухтысячный год подарил миру новую, 5.6, версию языка перл. Она уже выглядела намного солидней первых, имела 64-битные системы, в состоянии была поддержать файлы более двух Гб, включала представление строк, учитывая стандарт юникод, а также ключевое слов - our. В этот период меняется схема наименований версий, чтобы она была более близкой к другим проектам - с открытым исходным кодом.

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

Уолл тогда обратился к своим приверженцам с просьбой вносить предложения для создания более продвинутой версии. Его призыв был услышан, а итогом явился 361 документ, что помогло разрабатывать VI версию. На суд пользователям представили документ, который, скорее всего, походил на сводку, а эта версия существовала, но лишь в виде описания языка. Ряд документов превратился в спецификацию этой версии. Попытка запустить в действие интерпретатор VI версии в 2006 году была остановлена. Но с 2009 года под названием Rakudo Perl эта версия живет и периодически ее обновляют.

Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперед.

Новая версия

Версия 5.8 появилась в 2002 году. Знаменита она тем, с этого времени ежегодно обновлялась до 2008 года, значительно улучшила поддержку юникода, добавила много функций, в которые входят поддержка многопоточности, оригинальная реализация ввода-вывода и увеличила точность числовую. И, опять же, появились новые модули.

К 20-летию создания языка программирования общего назначения новая версия под номером «5.10.0» не разочаровала пользователей в очередной раз. Появились новые операторы, а также «умный» - совпадения, прошло обновление регулярных выражений.

Что принесли последние годы работы?

Каждый год все новые усовершенствования помогали сделать язык, изобретенный Уоллом, все наиболее легче проще и доступнее. 2010 год ознаменовался тем, что синтаксис языка perl получил поддержку package NAME VERSION, регулярных выражений, в последующие годы обновлялись модули, расширялась поддержка операторов.

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

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

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

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

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

  • Часть 1: Типы переменных (вы читаете эту часть)

В нем вы найдете примеры простых программ из серии «вывести числа от 1 до 5» и тому подобное. Мне всегда нравилось учиться на примерах — это интереснее и быстрее, чем по книжкам или на семинарах. Также можете посмотреть посты этого блога, — велика вероятность, что в них вы найдете еще примеры.

Я предполагаю, что в школе/институте вы изучали Pascal/Delphi, C или хотя бы Basic, и объяснять, что такое функция и циклы не требуется. Если это не так — ничего страшного, просто для того, чтобы во всем разобраться, вам придется потратить лишнее время на чтение Википедии. Если вы не знаете, как запустить bash-скрипт, или для чего в первой строке скрипта писать что-то вроде #!/bin/sh , придется немного погуглить , чтобы это выяснить.

Специально для тех, кого интересуют вопросы, «а правда ли, что Perl очень сложен», «а какие книжки по Perl можете посоветовать» и даже «эээ… а что, на нем еще пишут?», я написал Mini-FAQ по Perl , которое вы можете прочитать на HabraHabr. А для тех, кто неасилил многабукв здесь я приведу краткое его содержание:

  • Perl — современный язык программирования, на котором пишут и будут писать еще очень долго.
  • Perl, как и любой другой язык программирования, имеет свои достоинства, недостатки и области применения. Существует действительно большой класс задач, которые Perl решает на 5+.
  • Синтаксис Perl не сложнее синтаксиса C++ или Java. В этом вы сможете убедиться, дочитав данный пост до конца.
  • Существуют хорошие и при этом недорогие учебники по Perl. Также в сети вы без труда найдете сообщество perl-программистов, говорящих на вашем родном языке.
  • Perl хорошо работает как под операционными системами семейства UNIX, так и под Злом Windows.

Дополнение: Также я рекомендую вам ознакомиться со статьями Perl vs Python vs Ruby vs PHP и Жрецы программирования . Первая повествует о производительности различных скриптовых языков, вторая — об отличии PHP от других ЯП. Фанатам Пайтона советую прочитать заметку Тест производительности скриптов на Python . Надеюсь, что эти материалы помогут вам найти ответ на вопрос «чем хорош Perl».

Привет, %username%!

Итак, давайте уже напишем наш первый скрипт на Perl!

#!/usr/bin/perl

$name = shift () ;
print ("Hello, $name!\n " ) ;

Запускаем скрипт:

$ chmod u+x 1 .pl
$ ./ 1 .pl afiskon
Hello, afiskon!

Тут все очень просто:

  • Имена скалярных переменных (то есть не массивов и не хэшей, что это такое — см ниже) начинаются со знака доллара.
  • Функция shift возвращает очередной аргумент скрипта. Другими словами первый вызов shift() возвращает первый аргумент, второй вызов — второй аргумент и так далее.
  • Функция print() выводит строку, переданную в качестве аргумента.
  • В строку можно подставлять значения переменных (см строку 4). Подробнее о строках — см далее.

Если пока не очень понятно — ничего страшного. Возможно, немного теории внесет чуть больше ясности.

Типы переменных

В Perl существует три основных типа переменных: скаляры (числа и строки), массивы — подобно тем, что используются в Pascal или C (иногда массивы еще называют векторами), и хэши (ассоциативные массивы).

Скаляры мы уже использовали в предыдущем примере. Вот еще несколько примеров задания скаляров.

#!/usr/bin/perl

$a = 123 ;
$b = - 7.496 ;
$c = 0xABC; # равно 2748, да, это комментарий:)
$d = ($a + $b ) / $c ;
$d *= $a ; # тоже самое, что $d = $d * $a;

$str1 = "hello" ;
$str2 = "$str1, world" ; # в $str2 записано "hello, world"
$str3 = $a . "\n " . $str2 ;
$str4 = "$str1" ; # в $str4 записано "$str1", а не "hello"

Тут мы задаем положительные и отрицательные, целые и дробные числа, задаем число в шестнадцатеричной кодировке, складываем, умножаем и делим — все как в Си или Java. Кроме перечисленных операций Perl также поддерживает операцию возведения в степень:

$a = 2 ** 8 ; # результат: 256

Со строками все примерно так же, как в каком-нибудь PHP. Точка означает операцию конкатенации (то есть «склеивания» строк), если в строке содержатся имена переменных, на их место подставляются значения, с помощью обратного слэша можно вставлять символы новой строки (\n), табуляции (\t), кавычки (\"), сам обратный слэш (\\) знак доллара безо всякой подстановки переменных (\$) и многое другое. Если строка в одинарных кавычках, символы в ней трактуются «как есть», без подстановки переменных и тд.

Как и PHP, Perl интерпретирует скаляры, как числа или как строки в зависимости от операции. Все просто:

$int1 = "11" + 22 ;
# ^ строка "11" преобразуется в число,
# после чего выполняется сложение, результат: 33.
$str1 = "11" . 22 ;
# ^ число 22 преобразуется в строку,
# после чего выполняется конкатенация, результат: "1122".

Правила преобразования из строки в число и наоборот тут те же, что и в PHP:

$str1 = 0 . "abc" ;
# ^ результат - "abc", число ноль преобразуется в пустую строку
$int1 = "aaa" + 1 ;
# ^ результат - 1, в строке "aaa" нет цифр
$int2 = "12aaa" + 1 ;
# ^ результат - 13, учитываются только первые цифры строки

Кстати, для объявления длинных строк существуют специальные операторы — q и qq:

# аналогично одинарным кавычкам
$text = q {
Do you have $15 ?
} ;
# аналогично двойным кавычкам
$message = qq {
Hello, $username !
How are you?
} ;

Работа с массивами происходит следующим образом:

#!/usr/bin/perl

$scalar = "bebebebe" ;
($a , $b ) = (1 , 2 ) ; # тоже самое, что $a = 1; $b = 2;
@arr = ("aaa" , 123 , $scalar , $a + $b ) ;
print $arr [ 1 ] . "\n " ;
push @arr , $a ;
print pop (@arr ) . "\n " ;

Здесь мы создаем массив @arr, состоящий из 4-х элементов (строка 5). Затем выводим второй элемент (строка 6). Нумерация элементов начинается с нуля, поэтому для вывода второго по счету элемента используется индекс 1. Затем кладем в конец массива значение переменной $a (функция push, строка 7), и тут же извлекаем и выводим его (функция pop, строка 8).

Обратите внимание, имена массивов начинаются с «собаки», а не доллара (запомнить не сложно — соответствующие символы похожи на первые буквы английских названий типов: $ — scalar, @ — array). При обращении ко второму элементу массива (строка 6) использовался знак доллара, потому что элемент массива является скаляром. По началу это вызывает много путаницы, но вообще все логично.

Еще в этом скрипте мы вызываем функции print и push без скобок. В Perl при вызове функции, везде, где это не вызывает неопределенности, скобки можно опустить.

Для объявления массива, элементами которого являются строки без пробелов, существует специальный оператор — qw:

@arr = qw/aaa bbb ccc/ ;
# аналогично ("aaa", "bbb", "ccc"), только короче

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

#!/usr/bin/perl

%hash = ( # при объявлении хэшей и массивов можно
"x" => 12 , # использовать перенос строк
y => 53 , # если в ключе нет спец-символов, кавычки не нужны
"z" => - 10.5 , # запятую на конце можно оставлять
) ;

$hash { "x" } ++; # координата по x теперь равна 13
$hash { y } --; # координата по y теперь равна 52

# выводим координаты
print "x = $hash{x}, y = $hash{y}, z = $hash{z}\n " ;

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

Кстати, переменные $test, @test и %test — это совершенно независимые друг от друга переменные разного типа.

В этом месте я хотел перейти к условным операторам и циклам for/while, но понял, что для одного поста текста и так уже многовато. Между тем за кадром остались многие вопросы:

  • Условные операторы;
  • Циклы for и while;
  • Объявление функций;
  • Работа с потоками и файлами;
  • Строгий синтаксис;
  • Использование готовых модулей и классов.

Об этом я напишу в одной из следующих заметок. Хотелось бы получить хотя бы парочку комментариев на этот пост — интересно/неинтересно, понятно/непонятно и так далее. Кстати, если у вас есть вопросы, связанные с Perl (не обязательно с этим постом) — смело задавайте их в комментариях!

Надеюсь, серия постов о программировании на Perl поможет вам написать ваши первые простенькие скрипты. Со временем скрипты будут становится сложнее, в них станут использоваться новые технологии (ООП, регулярные выражения) и через какое-то время вы обнаружите, что знаете о Perl достаточно, чтобы делиться опытом с другими.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: