Язык программирования Perl
Язык программирования Perl читать книгу онлайн
Курс знакомит с языком программирования Perl, с его принципами, основными возможностями и особенностями в объёме, достаточном, чтобы начать разрабатывать прикладные и системные задачи, включая программирование для сети Интернет.
Курс является достаточно подробным введением в язык программирования Perl. Описывается уникальная культура Perl и особенности, отличающие его от других языков программирования и во многом обусловившие его популярность. Рассматриваются основные средства программирования на языке Perl версии 5.8. Разбираются богатые возможности языка для создания самых разных приложений, а также особый стиль программирования на Perl. Курс ориентирован на студентов, начинающих программистов или разработчиков, применяющих другие языки и желающих писать прикладные или системные программы на Perl.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Кстати, в пустом контексте можно употреблять любые другие выражения, хотя, конечно, смысл в этом есть далеко не всегда:
2 * 2; # результат отброшен, есть смысл, если стоит...'Истина где-то рядом'; # ...в конце подпрограммы$x++; # используется ради побочного эффектаОбращение к подпрограмме может записываться различными способами - главное, чтобы компилятор Рerl мог определить, что встретившийся идентификатор - это имя вызываемой подпрограммы. Дать подсказку об этом компилятору можно по-разному. В ранних версиях Perl при вызове перед именем подпрограммы требовался разыменовывающий префикс &. Например:
&sub_without_parameters; # вызов подпрограммы без параметров&sub_with_parameters($arg1, $arg2); # и с параметрамиВ современном Perl эта устаревшая форма вызова с префиксом & допустима и иногда используется. Гораздо чаще обращение к подпрограмме обозначается использованием круглых скобок после имени подпрограммы, даже если она вызывается без параметров. Как в этих примерах:
format_c(); # вызов подпрограммы без параметровformat_text($text, $font, $size); # и с параметрамиЧтобы обращаться к пользовательской подпрограмме в стиле встроенных функций без круглых скобок, нужно чтобы определение или объявление подпрограммы было известно компилятору раньше ее вызова.
sub circle; # объявление пользовательской функции$area_of_circle = circle $radius; # вызов функцииsub circle { # определение пользовательской функцииreturn 3.141592653*$_[0]*$_[0]; # площадь круга}В Perl эффективно реализована рекурсия, поэтому традиционные рекурсивные алгоритмы можно оформлять в виде вызова в подпрограмме самой себя. Например, как в классической функции вычисления факториала:
sub factorial ($) { # вычислить N!my $n = shift;return ($n <= 1) ? 1 : $n * factorial($n-1);}Для разработки универсальных подпрограмм программисту нужно знать, в каком контексте была вызвана подпрограмма - какого возвращаемого значения от нее ожидают. Для этого в Perl предусмотрена функция wantarray(). Она возвращает истинное значение, если подпрограмма вызвана в списочном контексте, ложное значение, если подпрограмма вызвана в скалярном контексте, и неопределенное значение, если подпрограмма вызвана в пустом контексте. Проверка ожидаемого значения в подпрограмме и примеры ее вызова могут выглядеть так:
sub list_or_scalar {my @result = fill_result(); # формируем результатыif (!defined wantarray) { # пустой контекст -return; # не возвращаем значения} elsif (wantarray) { # списочный контекст -return @result; # возвращаем список} else { # скалярный контекст -return "@result"; # возвращаем скаляр}}list_or_scalar(); # вызов в пустом контекстеmy @list = list_or_scalar(); # вызов в списочном контекстеmy $scalar = list_or_scalar(); # вызов в скалярном контекстеВ Perl программисту предоставляется возможность выполнить во время компиляции ограниченную проверку количества и типов параметров у подпрограммы. Это делается с помощью прототипа списка параметров. Для этого в определении и в объявлении подпрограммы после ее имени в круглых скобках указывается прототип. Прототип представляет из себя последовательность разыменовывающих суффиксов, определяющих количество параметров подпрограммы и типы их контекстов. Вот несколько примеров определения подпрограмм с прототипами:
# определение подпрограммы с 1-м параметром-скаляромsub list_mp3 ($) {my $path = $_[0];# ...}# определение подпрограммы c 2-мя скалярными параметрамиsub translate ([email protected]) { # и списком скаляровmy ($from_lang, $to_lang, @words) = @_;# ...}sub generate_test(); # объявление подпрограммы без параметровДля подпрограмм, определенных с прототипами, компилятор контролирует количество передаваемых аргументов и устанавливает ожидаемый подпрограммой контекст для каждого из аргументов. В приведенном далее вызове подпрограммы вместо массива ей будет передано количество элементов массива, поскольку прототип подпрограммы устанавливает скалярный контекст для единственного аргумента:
list_mp3 @dirs; # будет передан 1 скаляр: scalar @dirsПеречень символов, применяемых для описания прототипов, с примерами определения подпрограмм приведен в таблице 12.1.
Таблица 12.1. Обозначение прототипов подпрограмм
| Прототип | Требования к параметрам | Пример определения / описания | Пример вызова |
|---|---|---|---|
| () | отсутствие аргументов | sub mytime () | mytime; |
| $ | скалярное значение | sub myrand ($) sub myrename ($$) | myrand 100; myrename $old, $new; |
| @ | список скалярных значений (поглощает остальные параметры, поэтому употребляется последним в списке) | sub myreverse (@) sub myjoin ([email protected]) | myreverse $a, $b, $c; myjoin ':', $x, $y, $z; |
| & | подпрограмма | sub mygrep (&@) | mygrep {/pat/} $a, $b, $c; |
| * | элемент таблицы символов (например, дескриптор файла) | sub myopen (*$) | myopen HANDLE, $name; |
| взятие ссылки на следующий за ней прототип | sub mykeys (%) sub mypop (@) sub mypush(@@) | mykeys %hash; mypop @array; mypush @stack, $a, $b; | |
| ; | разделитель обязательных параметров от необязательных (в конце списка) | sub mysubstr ($$;$) | mysubstr $str, $pos; mysubstr $str, $pos, $length; |
