его изменения статуса $blksize - размер блока на диске $blocks - количество блоков в файле. Если указан аргумент '_' то возвращается результата предыдущего вызова stat(). study скаляр study Влючение метода частотного сравнения. Целесообразность применения зависит от количества поисков и количества констант в строке в которой ведется поиск. Функция работает следующим образом: Для указанного скаляра (если аргумент отсутсвует берется значение переменной $_) строится список указателей на каждый символ строки. Затем когда начинается поиск первыми просматриваются символы которые наиболее редко встречаются в английском языке. Выигрыш по времени очевиден когда выполняется многократный поиск в одной и той же строке и время затраченной на индексацию окупается. substr выражение, смещение, длина substr выражение, смещение Возвращает подстроку выражения начиная со смещения и заданной длины. Если смещение отрицательное то отсчет ведется от конца строки. Если длина не указана то берется все до конца строки. symlink старый_файл, новый_файл Создает новый файл символически связанный со старым т.е. создает ссылку на файл. Возвращает 1 при успехе и 0 - неудаче. syscall список Выполняет системную функцию. Первый элемент списка - это имя функции а остальные элементы - ее аргументы. Если функция не выполнима то возвращается фатальная ошибка. Аргументы интерпретируются следующим образом. Если аргумент число, то оно считаестя целым. Если не число то аргумент считается указателем на строку. Вам необходимо обеспечить достаточную длину аргумента для подстановки значения указателя. В Пел передается максимум 14 параметров. Обычно этого достаточно. sysread файл, скаляр, длина, смещение sysread файл, скаляр, длина Прочитать из файла указанное число байт в скаляр с помощью системного вызова read(). Смещение обозначает позицию в скаляре после которой будут вставлены прочитанные байты. system список Делает то же самое что и "exec список" с той лишь разницей что вызов fork() делается первым и родительский процесс ждет завершения потомка. Возвращает значение аналогичное функции wait(). Для получения действительного кода завершения необходимо разделить на 256. syswrite файл, скаляр, длина, смещение syswrite файл, скаляр, длина Записать в файл укзанное число байт скаляра с помощью системного вызова write(). Смещение указывает позицию в скаляре откуда начинается запись. tell файл tell Возвращает текущую позицию указателя в открытом файле. Если файл не указан то последнего читаемого файла. telldir директория Возвращает текущую позицию указателя в открытой директории. Обычно это параметр для позиционирования указателя директории функцией seekdir(). tie переменная, класс, список Присваивает переменную классу. Список - это аргументы new метода класса (TIESCALAR, TIEARRAY или TIEHASH). Возвращает указатель на созданный новый объект класса который удобен для вызова других методов класса. Внимание! Такие функции как keys() и values() могут вернуть в качесте значения огромное количество данных. Для создания объекта ассоциативного типа необходимо определение следующих методов: TIEHASH classname, LIST DESTROY this FETCH this, key STORE this, key, value DELETE this, key EXISTS this, key FIRSTKEY this NEXTKEY this, lastkey Обычного массива: TIEHASH classname, LIST DESTROY this FETCH this, key STORE this, key, value [others TBD] Скалярного типа: TIEHASH classname, LIST DESTROY this FETCH this, key STORE this, key, value time Возвращает количиство секунд начиная с 1 января 1970 г 00:00:00 UTC. Годы не разделяются на високосные. times Возвращает 4-х элементный массив значений: ($user, $system, $cuser, $csystem) = times; где: $user - пользовательское время процесса в секундах. $system - системное время текущего процесса. $cuser - время процесса-потомка текущего прцесса. $csystem - его системное время. tr/// Опрератор транслятор. Подробно смотри главу "Операторы". truncate файл, длина truncate выражение, длина Усекает длину указанного файла. uc выращение Возвращает строку выражения в которой малые буквы заменены на заглавные. ucfirst выражение Возвращает строку выражения в которой первая буква заменена на заглавную. umask выражение umask Устанавливает маску umask и возвращает старое значение. Без аргумента возвращает текущее значение. undef выражение undef Делает неопределенным значение выражения. Применяется только для скалярных переменных, целых массивов или подпрограмм. Всегда возвращает неопределенное значение. unlink список Удаляет файлы указанные в списке. Возвращает количество удаленных файлов. Только супервизор может удалять директории с файлами если Пел запущен с ключом -U. unpack шаблон, выражение Функция обратная pack(). Распаковывает строку выражения по указанному шаблону в массив значений. В скалярном контексте возвращает значение только первого элемента. Шаблоны такие же как и в pack(). Символ '%' в шаблоне означает что вы хотите получить вместо значения его контрольную сумму. По умолчанию 16 битовую. untie переменная Исключает переменную из класса указанного tie(). unshift массив, список Противоположное shift. Помещает элементы списка в начало массива. use модуль список use модуль Указывает библиотечный модуль из которого можно вызывать подпрограммы. Список перечисляет имена подпрограмм которые добавляются к текущей область имен. Если не указан то все имена. Действие аналогично блоку: BEGIN { require модуль; import модуль список; } Сам модуль должен распологаться в системной области Пел файлов. utime список Изменяет дату обращения и модификации файлов из списка. Первые два элемента списка должны указывать новое значение даты обращения и модификации. Возвращает количество измененных файлов. values хеш Возвращает обычный массив со всеми значениями хеша. В скалярном контексте возвращает количество значений хеша. vec выражение, смещение, бит Возвращает значени строки как вектор без знаковых целых. wait Ожидать окончание порожденного процесса. Возвращает PID для родительского процесса или -1 если нет процесса потомка. Код завершения записывается в переменную $?. waitpid PID, FLAGS Ожидать окончания процесса потомка с указанным PID. Возвращает либо PID этого процесса либо -1 если нет такого процесса. Код завершения записывается в перменную $?. wantarray Возвращает true если подпрограмма вызывается в списковом контексте и false - в скалярном. warn список Выодит в стандартный поток ошибок STDERR сообщение аналогично die(), но не прекращает работу программы. write файл write выражение write Выводит в файл форматированные данные по оператору format. По умолчанию имя формата совпадает с именем указателя файла. Имя файла-по умолчанию можно изменить функцией select(), а имя формата при этом надо присвоить переменной $~. Заголовок листа пишется автоматически. Если на листе не хватает места для вывода то выводится "перевод формата" и специальная форма заголовка листа затем сами записи. По умолчанию имя формата заголовка листа состоит из имени указателя файла и добавленной строки "_TOP". Динамически это млжно делать присваивая формат переменной $^. Количество оставшихся строк листа содержится в переменной $- и если присвоить ей 0 то произойдет смена листа. Подробно описание форматов смотри в главе "Форматы". y/// Оператор транслятор. Смотри главу "Операторы".  * Подпрограммы *  Для применения подпрограммы ее необходимо определить либо в текщем модуле (файле) либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом: sub имя; # Только декларация. Определение ниже. sub имя (прототипы); То же но с декларацией параметров. sub имя блок; # Декларация и определение. sub имя (прототипы) блок; # То же, но с парамметрами. Для определения динамичской анонимной подпрограммы можно указать: $переменная = sub блок; Для импортирования подпрограмм из других модулей используйте: use модуль qw(подпрограмма1 подпрограмма2 ); Вызов подпрограммы: имя(список параметров); # символ '&' можно не указывать. имя список; # Если подпрогрмма уже декларирована. &имя; # Параметры в @_ Все параметры передаются подпрограмме как массив @_. Соответсвенно $_[0] - первый параметр, $_[1] - второй и т.д. Массив @_ - локальный, но он содержит адреса параметров поэтому можно изменять значение параметров. Возвращаемое значение подпрограммы - результат последнего оператора. Это может быть как скаляр так и массив. Можно принудительно возвращать результат используя функцию return(). Подпрограмму можно вызвать используя префикс '&' перед именем подпрограммы. Если подпрограмма предварительно продекларирована то префикс и скобки можно опустить. Private переменные. Для применения переменных доступных только внутри блока или подпрограммы необходимо определить их с помощью функции my(список). Если переменная одна то скобки можно опустить. my() декларирует private переменные в пределах текущей подпрограммы, блока, функции eval() или do/require/use файлов. Private переменные аналогичны auto переменным в С. Пример: # Программа вычисления факториала. print fact(3); # вычислить факториал 3*2*1 sub fact # Определяем подпрограмму. { my $m; # private переменная но не local ! $m = $_[0]; return 1 if $m <= 1; return($m * fact($m -1)); } Можно указывать начальные значения private переменных как: my(список) = выражение; Так для вышеприведенного примера лучше было написать: my($m) = $_[0]; Переменные типа local. В общем лучше использовать private переменные так-как это надежней и быстрее. private переменные обеспечивают лексическую область применения (видимости) а local - динамическую. Обычно это переменные форматов значение которых должно быть видимо из вызываемых подпрограмм. Применение функции local() не целесообразно в циклах так как она вызывается каждый раз и таким образом заметно замедляет время выполнения цикла. Прототипы (prototypes). Для краткого описаня типа параметров передаваемых подпрограмме можно применять прототипы. В Пел существуют следующие прототипы: Декларация Пример вызова sub mylink($$) mylink $old, $new sub myvec($$$) myvec $var, $offset, 1 sub myindex($$;$) myindex &getstring, "substr" sub myreverse(@) myreverse $a, $b, $c sub myjoin($@) myjoin ":",$a,$b,$c sub mypop(\@) mypop @array sub mysplice(\@$$@) mysplice @array, @array, 0, @pushme sub mykeys(\%) mykeys %{$hashref} sub myopen(*;$) myopen HANDLE, $name sub mypipe(**) mypipe READHANDLE, WRITEHANDLE sub mygrep(&@) mygrep { /foo/ } $a, $b, $c sub myrand($) myrand 42 sub mytime() mytime Здесь: \'символ' - параметр с типом 'символ' '@' или '%' - все оставшиеся параметры как список '$' - скаляр '&' - безимянная подпрограмма '*' - ссылка на таблицу имен ';' - разграничитель обязательных и не обязательных параметтров. Ссылка как параметр. Иногда нужно в качестве параметра передать подпрограмме не значение элемента массива а ссылку на него, что бы подпрограмма могла изменить значение элемента. Для этого в Пел к имени переменной добавляется символ '*' Подбное выражение называют 'type glob' так как в Юниксе символом '*' обозначают "все возможные значения". Поэтому '*' для массива означает "все элементы массива". Для скаляров употряблять '*' не имеет смысла т.к. они и так передаются ссылкой и вы можете изменять значение параметра изменяя например переменную $_[0]. Переопределение встроенных функций. Большинство встроенных функций Пел можно переопределить своими собственными. Обычно это делают для удобства совместимости Пел для разных платформ систем. Для этого нужно перечислить имена этих функций в виде: use subs 'функция1', 'функция2' ....; и далее в модуле определить сами функции. Автозагрузка. Если вы попытаетесь вызвать не существующую функцию то Пел выдаст немедленно сообщение об ошибке. Но если вы определите подпрограмму с именем 'AUTOLOAD' то она будет вызвана с теми же параметрами а переменная $AUTOLOAD будет содержать имя не существующей подпрограммы. Данный механизм очень удобен для средств отладки.  * Модули (packages) *  В Пел реализован механизм модулей. Модуль это группа подпрограмм и переменных обычно включенных в один файл. Внутри одного модуля можно определить другой модуль. Начало модуля определяется директивой: packages имя_модуля; Конец модуля это конец блока или файла. Головной модуль имеет по умолчанию имя main. На имя внутри модуля можно ссылаться добавляя '::' после имени модуля. Например: $main::var1 - переменная в головном модуле. ::var1 - то же самое. Имя main можно опускать. $модуль1::var1 - переменная в модуле 'модуль1' $модуль1::модуль2::var1 - Модуль2 содержится в модуле 1. Только идентификаторы начинающиеся с буквы или символа '_' хранятся в пространтсве имен текущего модуля. Остальные хранятся в пространстве головного модуля main. Кроме этого имена STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC и SIG так же хранятся в головном модуле. Таблицы имен. Все имена модуля хранятся в ассоциативном массиве (хеше) с именем модуля к которому добавлены символы "::". Таким образом имена головного модуля хранятся в %main:: , модуля 'mod1' в %mod1:: и т.д. Выражение вида *имя указывает значение элемента хеша 'имя' это удобно для определения констант. Например: *pi = \3.14159; Здесь переменная $pi - это константа пи которую уже нельзя изменить. Конструкторы и деструкторы. Конструктор - это подпрограмма которая выполняется в момент создания объекта, а деструктор - удаления объекта. Для модуля это подпрограммы с именами BEGIN и END. При определении этих подпрограмм слово sub можно опускать. Конструктор BEGIN выполняется сразу как только возможно т.е. как только он определен даже не завершая дальнейший разбор программы. Можно указать несколько блоков BEGIN. Они будут выполняться один за другим в порядке определения. Деструктор END выполняется последним как только возможно т.е. при завершении работы интерпрератора. Можно указать несолько блоков END при этом они будут выполняться в обратном определению порядке. Классы. В Пел нет специального синтаксиса для классов. Но функционально полноценными классами могут быть модули. При этом подпрограммы модуля становятся методами, а с помощью массива @ISA можно реализовать механизм наследования в классах. Более подробно классы описаны отдельно. Создание библиотеки. Если вы хотоите создать модуль отдельным файлом и использовать как библиотеку подпрограмм, при этом вызывать подпрограммы библиотеки не указывая имени модуля, вам необходимо оформить модуль следующим образом: package имя_модуля; # Такое же как и имя этого файла без расширения '.pm' require Exporter; # Обязательная строка для экспорта имен @ISA = qw(Exporter); # -//- @EXPORT = qw(func1 func2) # Перечисляем имена функций. Внимание ! нет запятой! @EXPORT_OK = qw( $переменная @массив ); # Указать публичные переменные, массивы и т.д. если необходимо { # Начало блока модуля ..... sub func1 ........ sub func2 ........ 1; } Данный файл с расширением ".pm" должен храниться в одной из библиотечных директорий Пел. Они перечислены в массиве @INC одно из них обычно "/usr/local/lib/perl/". В головной программе вы указываете: use имя_модуля; и вам становятся доступны имена подпрограмм данного модуля. Стандартные Пел библиотеки. Стандартный набор библиотек обычно поставляется с дистрибутивом Пел они разделяются на pragma библиотеки (работают как директивы компилятору) и стандартные библиотеки. Pragma библиототеки. Данные библиотеки используют как: use имя; когда хотят включить действие и no имя; когда выключить. В стандартный набор входят следующие pragma: diagnostics Включить режим расширенной диагностики. integer Использовать целочисленную арифметику. less Режим минимальной загрузки компилятора. overload Режим переопределения операторов. sigtrap Режим слежения за прерываниями. strict Режим ограниченного использования "опасных" операторов. subs Режим обязательного декларирования подпрограмм. Стандартные библиотеки. AnyDBM_File Возможность работы с разными типами баз данных. AutoLoader Загрузка в память функций только во время вызова. AutoSplit Разделить модуль для автозагрузки. Benchmark Анализ скорости исполнения программы. Carp Предупреждения об ошибках. Config Доступ к конфигурации Пел. Cwd Получить имя текущей рабочей директории. DB_File Работа с базой данных формата Berkley DB. Devel::SelfStubber Режим отладки автозагрузки. DynaLoader Динамическая загрузка библиотек C. English Использовать длинные имена встроенных переменных. Env Импортировать имена переменных окружения Exporter Обеспечивает экспорт/импорт для модулей. ExtUtils::LibList Определяет используемые библиотеки. ExtUtils::MakeMaker Создает файл проекта Makefile ExtUtils::Manifest Программы для создания и проверки файла MANIFEST ExtUtils::Mkbootstrap Применеие файла начальной загрузки для DynaLoader. Fcntl Определения как и в С Fcntl.h File::Basename Синтаксический разбор спецификации файла. File::CheckTree Быстрый проход по директориям диска. File::Find Быстрый поиск файлов по директориям. FileHandle Обеспечивает объектный метод доступа к указателям файлов. File::Path Создание/удаление директорий. Getopt::Long Расширенная обработка опций. Getopt::Std Стандартная обработка опций. I18N::Collate Сравнение символов локалбной кодировки. IPC::Open2 Межпроцессорный обмен по чтению и записи. IPC::Open3 Межпроцессорный обмен по чтению, записи, и обрабоки ошибок. Net::Ping Тест доступа к хосту. POSIX Стандартный интерфейс по IEEE Std 1003.1 SelfLoader Загрузка функций только по вызову. Socket Определение структур и констант как и в С socket.h Test::Harness Стандартный тест с статистикой. Text::Abbrev Создание таблицы сокращений по списку. Подробное описание каждой библиотеки записано в самом файле. CPAN Програмисты всего мира работающие с Пел создали общедоступную библиотеку модулей CPAN. Она доступна через Интернет и содержит огромное количество различных по назначению модулей. К ним относятся документаторы, системные интерфесы, интерфейсы работы с базами данных, работа в сети, с файлами, Интернет-броузеры, системы поиска, огромное количество CGI скриптов для Web серверов и многое многое другое. Список некоторых CPAN серверов вы можете найти в приложении.  * Форматы *  В Пел реализован удобный метод создания форматированных отчетов. С помощью оператора format вы описываете заголовки, размеры полей, указываете положение данных на листе в удобной текстовой форме. Затем выполняете команду write(файл) которая выводит отформатированные данные в указанный файл. Оператор формат имеет следующий синтаксис: format имя = FORMLIST . Обратите внимание на то что описание формата идет после строки format и заканчивается символом '.' в начале строки. Здесь 'имя' - это имя формата, такое же как и имя указателя выходного файла. Если 'имя' отсутсвует то значение по умолчанию - STDOUT. FORMLIST - это строки формата. Они бывают трех типов: 1. Комментарий. Строка начинается символом '#'. 2. Описатель полей данных (picture). 3. Строка аргументов используемых описателем. Описатель - это строка которая выводится в виде "как есть" за исключением специально обозначенных форматов полей данных. Каждое поле начинается либо символом '@' либо '^'. В описательной строке указывается только положение и вид выводимых данных, но не имена полей и переменных. Для этого предназначена следующая строка аргументов которая следует всегда после описателя и содержит имена переменных или целые выражения в порядке указанном описателем. Размер и вид поля в описателе обозначается следующими символами: ">>>>" - выровнить значение по правому краю. "<<<<" - -//- по левому. "||||" - -//- по центру. "####.###" - формат числа с точкой. "@*" - многострочная строка. Данные выводятся в колонку. Размер поля равен количеству указанных символов. Символ '^' в начале поля имеет специальное значение. Так: "^####" - пусто если переменная не определена. для строчного скаляра: "^<<<<<" - Выводится сколько возможно символов, а значение переменной меняется на остаток вывод которого можно продолжить на следующих строках которые могут иметь свои поля. Пример: #!/usr/local/bin/perl # # Программа печати пригласительного билета # $кому = "Чапаеву Василию Ивановичу"; $от_кого = "Компания МММ"; $адрес = "Москва, ул. Петровка, д 38"; $текст = "Уважаемый Василий Иванович! Компания МММ имеет честь пригласить Вас и Ваших близких на презентацию наших новых хромовых сапог, сделанных на уровне мировых стандартов качества и дизайна."; format STDOUT = П Р И Г Л А С И Т Е Л Ь Н Ы Й Б И Л Е Т ---------------------------------------------------------------------- Кому: @<<<<<<<<<<<<<<<<<<<<<<<<<< | ^||||||||||||||||||||||||||||||| $кому, $текст | ^||||||||||||||||||||||||||||||| $текст От кого: @<<<<<<<<<<<<<<<<<<<<<<< | ^||||||||||||||||||||||||||||||| $от_кого, $текст | ^||||||||||||||||||||||||||||||| $текст Адрес:@<<<<<<<<<<<<<<<<<<<<<<<<<< | ^||||||||||||||||||||||||||||||| $адрес, $текст | ^||||||||||||||||||||||||||||||| $текст | ^||||||||||||||||||||||||||||||| $текст | ^||||||||||||||||||||||||||||||| $текст ---------------------------------------------------------------------- Отпечатано в типографии ИТУ 38 . write(); # Вывод данных. exit 0; # Конец программы Результат: П Р И Г Л А С И Т Е Л Ь Н Ы Й Б И Л Е Т ---------------------------------------------------------------------- Кому: Чапаеву Василию Ивановичу | Уважаемый Василий Иванович! | Компания МММ имеет честь От кого: Компания МММ | пригласить Вас и Ваших близких | на презентацию наших новых Адрес:Москва, ул. Петровка, д 38 | хромовых сапог, сделанных на | уровне мировых стандартов | качества и дизайна. | ---------------------------------------------------------------------- Отпечатано в типографии ИТУ 38 Специальные переменные: $~ - построчный формат содержимого. $^ - формат заголовка листа. $% - номер листа. $= - строк в листе. Если вы хотите использовать одни и те же форматы для разных файлов то самый простой путь: use FileHandle; # Указать в начале программы format_name файл имя_формата; # Формат содержимого листа. format_top_name файл имя_формата; # Формат заголовка листа. write(файл); # вывод данных. Здесь 'файл' имеется ввиду указатель файла полученный командой open(); Если вам нужно в теле листа выводить разного рода форматы (например заголовки групп или отбивку листа) то применяйте format_name.  * Отладка Пел программ *  В Пел реализован превосходный механизм отладки программ. Вам достаточно запустить программу с ключом '-d' и вы начнете работать с интерактивным отладчиком. Вам становятся доступны все переменные и массивы, вы можете вводить выражения и операторы, трассировать, исследовать работу программы в по-шаговом режиме и многое другое. Ниже перечисленны команды отладчика которые вы можете вводить на его подсказку. Команды отладчика. h - Получить справку по командам. T - Просмотреть стек программы s - Выполнить одну команду и остановиться. n - Выполнить подпрограмму и остановиться. r - Выполнить текущую подпрограмму и остановиться. c - Продолжить выполнение до сдедующей точки остановки. c номер - Продолжить выполнение до строки с данным номером. <CR> - Повторить последнию команду n или s. l min+incr - Вывести incr+1 строк программы начиная со строки min. l min-max - Вывести строки начиная с min до max. l номер - Вывести строку с указанным номером. l - Вывести следующий экран строк. - - Вывести предыдущий экран строк. w строк - Вывести экран строк. Текущая в середине. l подпрограмма - Вывести строки указанной подпрограммы. /шаблон/ - Найти строку в тексте программы. ?шаблон? - Обратный поиск строки в тексте программы. L - Вывести строки с точками останова и активами. S - Вывести имена всех подпрограмм. t - Включить или выключить трассировку. b строка [ условие] - Установить точку остановки. b подпрограмма [ условие ] - Установить точку остановки в начале указанной подпрограммы и если указано при данном условии. d - Убрать точку остановки. D - Убрать все точки остановки. a строка команда - Установить актив (команду которая выполнится вместе с указанной строкой. "команда" - обычныая команда Пел. A - Стереть все активы. < команда - Выполнять команду перед каждой остановкой. > команда - Выполнить команду после остановки отладчика. V модуль [имена] - Вывести значение всех или указанных имен в модуле. Внимание! Символ '$' не вводится. X [имена] - То же что и V , но только для текущего модуля. ! номер - Выполнить одну строку программы. ! -номер - Выполнить одну команду с номером предшествующим текущей строке. H - n - Вывести n последних выполненных команд. q или ^D - Выход из программы. команда - Выполнить команду Пел. p выражение - Вывести значение выражения. Конструктор BEGIN не отслеживается отладчиком, но можно в теле конструктора указать: $DB::single =1; и отладчик остановится. Данная команда не вызовет ошибку при работе без отладчика.  * Список литературы *  При написании книги автор в основном пользовался описанием Пел "Perl Programmers Reference Guide". Наиболее известная зарубежная литература: Programming Perl (the Camel Book) Learning Perl (Llama Book)  * Интернет - ссылки *  Очень полезные USENET конференции: comp.lang.perl.announce - Различные объявления и сообщения. comp.lang.perl.misc - Место для вопросов и обсуждений. comp.lang.perl.modules - Модули Пел. comp.lang.perl.tk - Пел и Tcl/tk. WWW сервера: http://www.perl.org ║ http:///www.perl.org - Специальный Пел-сервер http://www.ora.com ║ http://www.ora.com - Книги по Юникс издательства O`Reily ftp://ftp.perl.com ║ ftp://ftp.perl.com - Специализированный FTP сервер http://franz.ww.tu-berlin.de/modulelist ║ http://franz.ww.tu-berlin.de/modulelist/