Регулярные выражения (шаблоны)
В данной главе описывается синтаксис регулярных выражений. Чаще всегов Пел они используюстя в операторах поиска и замены таких как s//m/ операторах связки =~ или != и т.д.Как правило все эти операторы имеют схожие опции такие как: i - не различать строчные и заглавные буквы. m - считать строку многострочной. s - однострочная строка. x - расширенный синтаксис ( использование пробелов и комментариев) Обычно все эти опции обозначают как '/x'. Их можно использовать дажевнутри шаблонов, используя новую конструкцию (?...) Регулярные выражения или шаблоны (pattern) то же самое что и regexpпроцедуры в Юниксе. Выражения и синтаксис заимствован из свободнораспространяемых процедур V8 Генри Спенсера (Henry Spencer) там жеони подробно и описаны. В шаблонах используются следующие метасимволы (символы обозначающиегруппы других символов) часто называемых egrep - стандартом: \ - считать следующий метасимвол как обычный символ. ^ - начало строки . - один произвольный символ. Кроме '\n' - конец строки. $ - конец строки | - альтернатива (или) () - группировка [] - класс символов Метасимволы имеют модификаторы (пишутся после метасимвола): * - повторяется 0 или большее число раз + - повторяется 1 или большее число раз ? - 1 или 0 раз {n} - точно n раз {n,} - по меньшей мере раз {n,m} - не менше n, но и не больше m Во все других случаях фигурные скобки считаются обычными (регулярными)символами. Таким образом '*' эквивалентна {0,} , '+' - {1,}и '?' - {0,1}. n и m не могут быть больше 65536. По умолчанию действие метасимволов "жадно" (greedy). Совпадениераспространяется столько раз сколько возможно не учитывая результатдействия следуюющих метасимволов. Если вы хотите "уменьшить их аппетит"то используйте символ '?'. Это не изменяет значение метасимволовпросто уменьшает распространение. Таким образом: *? - станет 0 и более +? - 1 и более ?? - 0 или 1 раз {n}? - точно n раз {n,}? - не меньше n раз {n,m}? - больше или равно n и меньше m раз Шаблоны работают так же как и двойные кавычки поэтому в них можноиспользовать `\` - символы (бакслэш-символы): \t - символ табуляции \n - новая строка \r - перевод каретки \A - перевол формата \v - вертикальная табуляция \a - звонок \e - escape \033 - восьмеричная запись символа \x1A - шестнадцатеричная \c[ - control символ \l - нижний регистр следующего символа \u - верхний регистр -//- \L - все символы в нижнем регистре до \E \U - в верхнем -//- \E - ограничитель смены регистра \Q - отмена действия как метасимвола Дополнительно в Пел добавлены следующие метасимволы: \w - алфавитно-цифровой или '_' символ \W - не алфавитно-цифровой или '_' символ \s - один пробел \S - один не пробел \d - одна цифра \D - одна не цифра Обратите внимание что все это "один" символ. Для обозначения последовательностиприменяйте модификаторы. Так: \w+ - слово \d+ - целое число [+-]?\d+ - целое со знаком [+-]?\d+\.?\d* - число с точкой Кроме того существуют мнимые метасимволы. Обозначающие не существующиесимволы в месте смены значения. Такие как: \b - граница слова \B - не граница слова \A - начало строки \Z - конец строки \G - конец действия m//g Граница слова (\b) - это мнимая точка между символами \w и \W.Внутри класса символов '\b' обозначает символ backspace (стирания).Метасимволы \A и \Z - аналогичны '^' и '$' но если началостроки '^'и конец строки '$' действуют для каждой строки в многосторочной строкето \A и \Z обозначают начало и конец всей многосторчной строки. Если внутри шаблона применяется группировка (круглые скобки)то номер подстроки группы обозначается как '\цифра'.Заметьте что за шаблоном в пределах выражения или блока эти группы обозначаютсякак '$цифра'. Кроме этого существуют дополнительные переменные: $+ - обозначает последнее совпадение $& - все совпадение $` - все до совпадения $' - все после совпадения Пример: $s = "Один 1 два 2 и три 3";if ($s =~ /(\d+)\D+(\d+)/) { print "$1\n"; # Результат '1' print "$2\n"; # '2' print "$+\n"; # '2' print "$&\n"; # '1 два 2' print "$`\n"; # 'Один ' print "$'\n"; # ' и три 3' } Пел версии 5 содержит дополнительные конструкции шаблонов: (?#комментарий) - комментарий в теле шаблона. (?:шаблон) - группировка как и '( )' но без обратной ссылки (?=шаблон) - "заглядывание" вперед. Например /\w+(?=\t)/ соответствует слову за которым идет табуляцияно символ '\t' не включается в результат. Пример:$s = "1+2-3*4";if ($s =~ /(\d)(?=-)/) # Наити цифру за которой стоит '-' { print "$1\n"; # Результат '2' }else { print "ошибка поиска\n";} (?!шаблон) - "заглядывание" вперед по отрицанию. Пример:$s = "1+2-3*4";if ($s =~ /(\d)(?!\+)/) # Наити цифру за которой не стоит '+' { print "$1\n"; # Результат '2' }else { print "ошибка поиска\n";} (?ismx) - "внутренние" модификаторы. Удобно применять в шаблонах где например нужно внутри шаблона указать модификатор. Правила регулярного выражения. (regex) 1. Любой символ обозначает себя самого если это не метасимвол. Если вам нужно отменить действие метасимвола то поставьте перед ним '\'. 2. Строка символов обозначает строку этих символов. 3. Множество возможных символов (класс) заключается в квадратные скобки '[]' это значит что в данном месте может стоять один из указанных в скобках символ. Если первый символ в скобках это '^' - значит не один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-' обозначающий диаппазон символов. Например a-z один из малых букв латинского алфавита, 0-9 - цифра и т.д. 4. Все символы, включая специальные можно обозначать с помощью '\' как в языке С. 5. Альтернативные последовательности разделяются символом '|' Заметьте что внутри квадратных скобок это обычный символ. 6. Внутри регулярного выражения можно указыват "подшаблоны" заключая их в круглые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.
Операторы и приоритеты
|
|
|
|
|
|
|
|
Встроенные функции
Встроенные функции используются как термы выражений иподразделяются на две категории: списковые операторы и унарныеоператоры. Это влияет на их приоритет по отношению к оператору',' - запятая. Списковые операторы могут именть множество(список) аргументов, а унарные только один. Таким образомзапятая завершает аргументы унарного оператора и разделяетаргументы спискового. Аргумент унарного оператора воспринимается обычно вскалярном контексте а спискового как в скалярном так исписковом причем скалярные аргументы идут первыми. В дальнешемсписковые аргументы мы будем обозначать словом 'LIST' этозначит что функция имеет список аргументов разделенных запятой.Аргументы функций можно заключать в круглые скобки и такимобразом обозначать что "это функция" и приоритет не имеетзначения иначе это списковый или унарный оператор сопределенным фиксированным приоритетом. Пробел после именифункции и скобкой значения не имеет. Поэтому будьтевнимательны! Пример: print 1 + 2 + 3; # результат 6 print(1+2)+3; # результат 3 print (1+2)+3; # опять 3 print (1+2+3); # 6 Если функция возвращает результат как в скалярном так и в списковом контекстето код выхода по ошибке - скаляр c неопределенным значением или пустойсписок. Запомните правило: Не существует общего правила преобразования списка в скаляр! Каждый оператор и функция имеют свой вид значения в скалярном котексте.Для одних это количество элементов из скалярного контекста. Для другихпервый элемент списка или последний или количествоуспешных операций. Каждый свое если вы специально не указываете. Оператор '-X'. -X указатель файла -X выражение -X Проверка файла, где 'X' одно из ниже описанных значений.Это унарный оператор с одним аргументом - либо именем файла либоуказателем файла. Проверяет одно из условий. Если аргумент не указанто берется значение переменной $_. Для ключа -t STDIN.Результат 1 если true и '' если false или неопределенное значениеесли файл не найден. Несмотря на странный вид это унарный операторс соответсвующим приоритетом. Аргумент можно заключать в круглые скобки.'X' имеет следующие значения: -r Файл разрешен на чтение эффективным uid/gid -w на запись -//- -x исполнение -//- -o принадлежит эффективному uid (идентификатор пользователя) -R Файл разрешен на чтение реальным uid/gid -W на запись -//- -X исполнение -//- -O принадлежит реальному uid -e файл существует -z пустой -s не пустой -f обычный текст -d директория -l символическая ссылка -p pipes (конвейер) -S socket (гнездо) -b специальное блочное устройство -c -//- символьное -//- -t указатель на уст-во tty -u установлен бит setuid -g -//- setgid -k -//- sticky -T текстовой файл -B двоичный -M "возраст" файла в днях на момент старта скрипта -A дней с последнего чтения -C дней с последней модификации inode abs выражение Абсолютное значение выражения accept NEWSOCKET, GENERICSOCKET Окрыть новый сокит по внешнему запросу. Аналогичносистемному вызову accept(). Возвращает адрес или false в случаенеудачи. alarm секунды Послать сигнал SIGALARM текущиму процессупо истечении указанного промежутка времени. Не допустимо делатьнесколько вызовов одновременно в одном промежутке времени.Возвращает остаток времени предыдущего счетчика. atan2 Y, X Арктангес отношения Y к X в пределах от -pi до +pi. bind сокит, имя Назначить сетевой адрес сокиту. Подобно системномувызову bind. Возвращает true в случае успеха и false иначе.Имя - пакетный адрес сокита. binmode файл Открыть файл для двоичного (binary) режима доступа.В обычном режиме при вводе символы CR LF транслируются в LF,а при выводе LF транслируется в CR LF. bless ссылка, классbless ссылка Данная функция определяет что объект указанный ссылкойпринадлежит классу. Если класс не указан то он относится к текущемуклассу. Обычно это последний оператор в конструкторе объекта.Необходимо обязательно указывать имя класса если определяемыйобъект может наследоваться классом-потомком. caller выражениеcaller Возвращает контекст вызова текущей подпрограммы.В скалярном контексте true если это подпрограмма или процедуравызванная операторами eval() или require() и false - иначе.В списковом это список ($package, $filename, $line)где $package - имя пакета $filename - имя файла пакета $line - номер строки откуда был сделан вызов. Если указано выражение то возвращается список: ($package, $filename, $line, $subroutine, $hasargs, $wantargs)Выражение определяет "глубину" вложенности просмотра стека вызовов. $subroutine - имя подпрограммы $hasargs - имеющиеся аргументы $wantargs - необходимые аргументыПрименение данной функции в DB пакете возвращает более детальнуюинформацию. К списку аргументов добавляется список @DB::args. chdir выражение Перейти в директорию указанную выражением. Есливыражение отсутсвует то перейти в "домашнию" директорию.Возвращает true в случае успеха и false - неудачи. chmod список Изменить права доступа к файлам указанным в списке.Первый элемент в списке - числовое ,обычно восьмеричное значение прав.Возвращает количество файлов которым были изменены права. Пример: chmod 0666 'f1', 'f2', 'f3'; chomp переменнаяchomp списокchomp Удаляет в конце строки символ указанный переменной $/.Обычно это 'LF'. Возвращает количество удаленных символов.Если переменная не указана то используется переменная $_.Если указан список то обрабатывается каждая строка списка ивозвращается общее количество удаленных символов. chop переменнаяchop списокchop Полностью аналогично функции chomp но всегда удаляетпоследний символ строки. chown список Изменить "владельца" и "группу" файлов списка.Первый элемент - номер нового владельца, второй номер новой группыа далее список файлов.В большинстве Юникс-систем вы не сможете сменить владельца если выне суперпользователь, но можете изменить группу если это одна изваших "вторичных" групп. chr чмсло Возвращает символ с указанным кодом кодировки. chroot директория Сделать "корневой" указанную директорию."Корневая" - значит внутри программы на нее можно ссылаться как '/'. close файл Закрыть открытый файл или поток. Можно не использоватьесли один и тот же файл открывается повтортно т.к. он будетавтоматически закрываться новым вызовом open(). closedir директория Закрыть директорию открытую функцией opendir(). connect сокит, имя Связаться с удаленным сокитом. Данная функция подобнасистемному вызову connect(). Возвращает true в случае успехаи false при ошибке. cos выражение Косинус выражения в радианах. crypt текст, salt Шифрация текта. Аналогично системному crypt(). dbmclose хеш Закрывает связь между хеш и базой данных. dbmopen хеш, база, режим Ассоциировать указанный хеш и базу в определенном режиме.Дело в том что в Пел реализован очень удобный механизм работыс базами данных типа dbm, ndbm, sbdm, gdbm и Berkeley DB. Для этого нужносвязать (открыть) базу под именем хеша. Вся работа с записямибазы выполняется так будто это обычный хеш (ассоциативный массив).Более подробно смотрите описание функции AnyDBM(). define выражение Возвращает true если значение определено (существует)и false если нет. Многие операции завершаются не определеннымзначением, например чтение после конца файла, использованиене определенных переменных, системные ошибки и т.д.Данная функция позволяет различать нулевое и не определенныезначения, определенность или не определенность функций илиссылок. При использовании определенности ключа в хешеона возвращает определен данный ключ или нет но не существуетон или нет. delete выражение Удалить значение из хеша. Возвращает удаляемое значениеили не определенность если ни чего не удаляется.Удаление из массива окружения $ENV{} - изменяет окружение.Удаление из хеша связанного с базой данных - удаляет запись вбазе данных. die список Если программа не была запущена из eval() даннаяфункция выводит список в поток STDERR и завершает работупрограммы с кодом из переменной $!. Если $! содержит 0то с кодом ($? >> 8). Если и это 0 то с кодом 255.При вызове из eval() сообщение об ошибке заносится в переменную $@и eval() завершается с неопределенным значением. Это позволяетотробатывать ошибочные ситуации не завершая головной модуль.Если строка из списка не завершается символом '\n' то дополнительнопечатается номер строки скрипта откуда вызвана функция и номервходной строки исли таковой имеется. do BLOCK Это не совсем функция. Здесь возвращается значениепоследнего оператора блока. Когда используется циклический модификаторBLOCK исполняется перед проверкой условия цикла в отличии от обычныхциклов. do подпрограмма Устаревший метод вызова подпрограмм. do выражение Значение выражения воспринимается как имя файла Пел скрипта.Изначально это применялось для включения подпрограмм библиотеки.Сейчас правильней использовать вызовы use() и require() которыеобеспечивают контроль ошибок и завершения. dump метка Выполнние "дампа" текущей памяти. Применялось длявозможности исрользовать программу undump что бы включить текущийисполняемый код в программу после инициализации всех переменных.Выполнение этой новой программы будет начинаться операторомgoto метка. Если метка опущена то запуск сначала.Внимание! Файлы открытые до момента дампа не будут открытымив момент исполнения новой программой. each хеш Возвращает 2-элементный массив. Первый элемент - ключвторой - значение следующего элемента хеша. Позволяет"просматривать" все значения хеша в определенном порядке.Сброс переменной цикла происходит только после прохлждения всегомассива. eof файлeof()eof Возвращает 1 если выполняется чтение после конца иличтение из не открытого файла. Аргументом должно быть выражениевозвращающее существующий указатель файла. Данную функцию нельзяиспользовать для чтения файлов открытых как терминалы.Если аргумент не указан то используется последний читаемый файл.Использование в форме eof() целесообразно применять в циклахwhile(<>) для определения конца только последнего файла изсписка. Применяйте eof(ARGV) или eof для определения концакаждого файла из списка. eval выражениеeval блок Выражение сканируется и выполняется как обычная Пел программа.Это делается в контексте текущей программы поэтому можно использоватьуже определенные переменные и подпрограммы.Ворзвращается результат последнего оператора в блоке или значениеоператора return. Если обнаружится синтаксическая ошибка или выполнитсяоператор die возвращается не определенное значение а переменная $@содержит сообщение об ошибке. Если ошибки не было то $@ содержитнулевую строку. При отсутсвии аргумента берется значение переменной $_. exec список Выполняется системная команда из списка и выполнениепрограммы завершается. Если вам необходимо вернуться то лучшеприменяйте функцию system(). Если в списке количество аргументовбольше 1 или список это массив с количеством элементов больше 1то выполняется системный вызов execvp() с аргументами из списка.Если один скалярный аргумент то он сканируется на обработкуметасимволов и если они присутсвуют то полученные аргуметыпередаются интерпретатору /bin/sh -c для дальнейшей обработки.Если метасимволов нет то аргумент расщепляется на слова и передаетсясистемному вызову execvp() что более эффективно.Внимание! exec() и system(0) не сбрасывают буфер ввода/выводапоэтому необходимо установить переменную $| для предотвращенияпотери выходной информации. exists выражение Возвращает true если существует указанный ключ хешадаже если не определено его значение. exit выражение Выполнение программы завершается с кодом выражения. exp выражение Возвращает e (основание натурального логарифма) в степенивыражения. fcntl файл, функция, скаляр Выполняет системный вызов fcntl(). Для использованияобязательно выполнить use Fcntl; fileno файл Возвращает описатель файла для данного указателя файла. flock файл, операция Системный вызов flock() fork Системный вызов fork(). Возвращает pid потомка для родителяи 0 для потомка в случае успеха иначе - неопределенное значение. format Декларативная функция Пел. Определяет формат вывода дляоператора write. Подробно смотрите главу Форматы. formline формат, список Внутренняя функция используемая в format. Форматируетвывод параметров из списка. Результат помещается в переменную $^AФункция write просто выводит значение этой переменной, но ее так жеможно читать а затем обнулять. Обычно format выполняе один вызовformline для одной строки формы, но formline не разделяет строкиформата. Это значит что символы '~' и '~~' рассматривают весьформат как одну строку поэтому необходимо использовать многострочныеформыд для описания одной записи формата. getc файлgetc Читает и возвращает символ из указанного файла.Если файл не указан то читается STDIN. После конца файла возвращаетпустую строку. getlogin Возвращает текущий login из файла /etc/utmpНе применяйте для идентификации пользователя он не так сильно"закрыт" как getpwuid(). getpeername сокит Возвращает упакованный адрес удаленного сокита. getpgrp PID Возвращает группу процесса с указанным PID. Еслиаргумент отсутсвует возвращает группу текущего процесса. getppid Возвращает PID родительского процесса. getpriority WHICH, WHO Возвращает текущий приоритет процесса, группы процессовили пользователя.Группа системных вызовов
getpwnam NAME getgrnam NAME gethostbyname NAME getnamebyname NAME getprotobyname NAME getpwuid UID getgrid GID getservbyname NAME, PROTO gethostbyaddr ADDR, ADDRTYPE getnetbyaddr ADDR, ADDRTYPE getprotobynumber NUMBER getservbyport PORT, PROTO getpwent gethostent getnetent getprotoent getservent setpwent setgrent sethostent STAYOPEN setnetent STAYOPEN setprotoent STAYOPEN setservent STAYOPEN endpwent endgrent endhostent endnetent endprotoent endservent Все эти функции анологичны одноименным системным вызовам.В списковом контексте возвращают следующие списки: ($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpw* ($name, $passwd, $gid, $members) = getgr* ($name, $aliases, $addrtype, $length, @addrs) = gethost* ($name, $aliases, $addrtype, $net) = getnet* ($name, $aliases, $proto) = getproto* ($name, $aliases, $port, $proto) = getserv* В скалярном контексте возвращается имя или что-то другое в зависимостиот типа функции.Элемент $members в вызове getgr содержит разделенные пробелом именачленов группы.@addrs содержит IP адреса компьютеров в сети Интернет в упакованном виде.Для распаковки применяйте: ($a, $b, $c, $d) = unpack('C4',$addr[0]); getsockname сокит Возвращает упакованный адресс сокита локальной машины. getsockopt сокит, уровень, опция Возвращает опцию сокита. glob выражение Возвращает список файлов удовлетворяющих выражению с '*'как в команде ls. gmtime выражение Переводит местное время полученное функцией time() во времяпо Гринвичу.Обычно используется в виде: ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=gmtime(time); goto меткаgoto выражениеgoto &подпрограмма Бузусловный переход на метку. Нельзя делать переход наметку в структуру которая должна быть инициирована например подпрограммуили цикл foreach и т.д.Вторая форма применяется для динамического определения перехода. Например: goto ('метка1', 'метка2', 'метка3')[$i]; Здесь при $i = 0 будет переход на 'метка1', $i = 1 на 'метка2' и т.д. Третья форма (goto &подпрограмма) довольно "хитрый" метод подменыимени вызываемой подпрограммы именем текущей. Это используетсяв методе автозагрузки когда нужно запустить другую процедуруно под именем текущей как-будто та была вызвана раньше. grep блок, список grep выражение, список Выполнят блок или выражение для каждого элемента списка.Переменная $_ содержит текущий элемент.Возвращает список элементов с которыми выражение дало результат true.В скалярном контексте возвращает количество результатов true. hex выражение Воспринимает выражение как строку шестнадцетиричных цифри возвращает десятичное значение. import В Пел нет встроенной функции import, но есть методс помощью которого модули могут экспортировать область имендругим модулям. Подробно смотрите функцию use(). index строка, подстрока, позицияindex строка, подстрока Возвращает позицию первого вхождения подстроки в строкеначиная с указанной позиции. Если позиция отсутсвует то сравнениеначинается с начала строки. Отсчет позиции ведется с 0 если тольконе изменено значение встроеной переменной $[. Если подстрока ненайдена то результат меньше первой позиции на 1. Обычно это -1. int выражение Возвращает целую часть выражения. ioctl FILEHANDLE, FUNCTION, SCALAR Выполняет системный вызов ioctl(). В начале программынеобходимо указать: require "ioctl.ph"; join выражение, список Соединяет строки списка или массива в одну строкус кодом разделителя равному выражению. keys хеш Возвращает массив всех ключей хеша. В скалярномконтексте - количество ключей. Порядок следования ключейаналогичен порядку в each фунуции. kill список Послать сигнал (первый элемент) указанным в спискепроцессам. Возвращает количество процессов которые сигнал приняли. last меткаlast Функция аналогичная break в С. Прерывает цикл и переходитна указанную метку. Если метки нет на ближайший внешний цикл.Блок continue не выполняется. lc выражение Преобразовать строку в буквы нижнего регистра. lcfirst выражение Заменить первую букву строки на малую. length выражение Возвращает длину строки выражения. link OLDFILE, NEWFILE Создать файл NEWFILE связанный с файлом OLDFILE. listen SOCKET, QUEUESIZE Выполнить системный listen(). local список Объявляет перечисленные переменные как локальные в текущемблоке или подпрограмме. Если указано два и более имени ихнеобходимо заключить в круглые скобки. Предпочтительней использоватьфункцию my(). localtime выражение Преобразовать 9-элементный массив возвращаемый фугкциейtime относительно местного времени. Употребляется как: ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); log выражение Возвращает натуральный логарифм выражения. lstat файлlstat выражение То же что и системный вызов stat() но касательно ссылкина файл а не самого файла. m// Оператор соавпадения. Смотри главу "Операторы" map блок, списокmap выражение, список Выполняет блок или выражение для каждого элемента списка.Возвращает список результатов. mkdir директория, права Создать директорию с указанными правами доступа. Возвращает1 при успехе и 0 при неудаче. msgctl ID, CMD, ARG Системный вызов msgctl() System V msgget KEY, FLAGS Системный вызов msgget() System V msgsnd ID, MSG, FLAGS Системный вызов msgsnd() System V msgrcv ID, VAR, SIZE, TYPE, FLAGS Системный вызов msgrcv() System V my список Объявляет локальными переменные в списке.Если два или более имени их необходимо заключить в круглые скобки. next меткаnext Аналогичен continue в С. Переход к следующей итерации в цикле.Если в цикле присутсвует блок continue он так же выполняется.Если метка отсутсвует - переход на ближайший внутренний цикл. no Module список. Исключить использование указанных модулей. oct выражение Возвращает десятичное число представленное восьмеричными цифрами. open файл,выражениеopen файл Открыть файл с указанным именем. Аргумент "файл" - этофактически указатель на блок описания файла. Если имя (выражение)файла отсутсвует то имя считается таким же как и указатель файла.Если перед именем стоит символ '<' то файл открывается толькона чтение (значение по умолчанию). Если '>' - на запись.Если '>>' - на добавление записей. '+>' или '+<' - файл открытна чтение и запись одновременно.Если имя файла начинается с символа '|' то имя считается системнойкомандой на вход которой выводятся данные (поток).Имя '-' - стандартный вход (STDIN), '>-' - стандартный вывод (STDOUT).Функция возвращает true при успехе и false - неудаче. Если имя (выражение) начинается с символов ">&" то остатокимени считается именем указателя файла который окрывается повторно.Символ '&' может стоять после '<', '>>', '+>', '+>>' и '+<'.Режим повторного открытия должен соответсвовать первому.Выражение вида "<&=N" где N -число, эквивалентно системному вызовуfdopen().Если имя "|-" или "-|" то происходит "расщепление" (fork) процессана потомка и родителя. При этом возвращается номер процесса потомка(PID) внутри родительского процесса и 0 - внутри потомка. При этомзапись/чтение в файл родительским процессом воспринимается какчтение/запись потомком. Для потомка это стандартный ввод/вывод.Родительский процесс ждет завершения потомка после закрытия потокаи получает код завершения в переменной $?.Имя файла не должно содержать пробелов как в начале так и в конце. opendir указатель, выражение Открыть директорию с именем выражения для обработкифункциями readdir(), telldir(), seekdir(), rewinddir() и closedir().Возвращает true при успехе. ord выражение Возвращает ascii код первого символа выражения. pack шаблон, список Упаковывает список в двоичную структуру по шаблону.Шаблон - это строка символов описывающая порядок и тип упакованныхзначений. A - текстовая строка, добавляется пробелами. a - текстовая строка, добавляется 0 символом. b - битовая строка (возрастающая нумерация бит) B - битовая строка (убывающая нумерация бит) h - шестнадцатеричная строка ( младший байт - первый) H - шестнадцатеричная строка (старший байт первый) c - символ со знаком C - символ без знака. s - короткое целое (один байт) со знаком. S - короткое целое без знака. i - целое (два байта) со знаком. I - целое без знака. l - длинное целое (4 байта) со знаком. L - длинное целое без знака. n - короткое в "сетевом" формате. N - длинное в "сетевом" формате. v - короткое в "VAX" формате. V - длинное в "VAX" формате. f - single float. F - double float. p - указатель на строку ограниченную 0. P - указатель на структуру с фиксированной длиной. u - упаковка uuencode. x - нуль-байт X - резервный байт. @ - заполнить нулями позицию. За каждой буквой может стоять число означающее количество повторов.Для всех типов за исключением 'a', 'A', 'b', 'B', 'h' и 'H',упаковывается максимально возможное количество значений из списка.Символ '*' после типа означает использовать оставшиеся параметры.Тип 'a' и 'A' использует только одно значение из списка и добавляетостаток поля либо нуль-символами либо пробелами (при распаковкепо типу 'A' пробелы и нули отбрасываются, а по 'a' - нет).Типы 'b' и 'B' упаковывают строку в указанное число бит.Так же как и 'h' и 'H' в число ниблов (байт).'P' - упаковывает указатель на структуру с указанной длиной.Числа с плавающей запятой (floats и double) записываются встандартном для каждой машины формате и могут быть разнымидля разных типов машин. Заметьте, что Пел всегда используетдвойную точность (double) поэтому упаковка и распаковка потипу 'f' приведет к потере точности.Шаблоны для распаковки и упаковки совершенно одинаковы. Примеры: print(pack("ccc",65,66,67)); # Результат ABC print(pack("A4A3","ab","cdefg")); # "ab cde" print(pack("a4a3","ab","cdefg")); # "ab\0\0cde" pipe READHANDLE, WRITEHANDLE Аналогичен системному pipe(). pop массив Удаляет и возвращает последний элемент массива.Длина массива уменьшается на 1. Результат не определен если массивпустой. Если имя массива отсутсвует то извлекает из @ARGVдля головной программы и @_ для полпрограммы. pos скаляр Возвращает смещение от последнего m//g поиска. print файл списокprint списокprint Выводит строку или список строк в файл. Возвращает trueпри успехе. Аргумент файл может быть скалярной переменной содержащейимя указателя файла если он отсутсвует то осуществляется выводв стандартный выходной поток STDOUT (если не было вызова select()).Если список отсутсвует то выводится значение переменной $_.Для вывода по умолчанию в другой файл необходимо использоватьфункцию select().Так как print работает в списковом контексте, то все элементы спискатак же вычисляются в списковом контексте т.е. функции будут возвращатьсписковые значения. Аргументы можно заключать в круглые скобки.Если указатель файла - элемент массива то элемент нужно заключитьв фигурные скобки для вычисления блока. printf файл списокprintf список Аналогичен вызову "print файл sprintf(список)".Первый элемент списка должен быть форматом printf() как и в С. push массив, список Добавить элементы массива значениями из списка.Длина массива увеличивается на количество элементов списка. q/строка/qq/строка/qx/строка/qw/строка/ Обычные операторы строк. Смотри главу Операторы. quotemeta выражение Вычисляет выражение в котором метасимволы рассматриваютсякак обычные символы. rand выражениеrand Возвращает случайное число в диаппазоне между 0 и выражением.Если выражение отсутсвует - между 0 и 1. Данная псевдослучайнаяпоследовательность сбрасывается функцией srand(). read файл, скаляр, длина, смещениеread файл, скаляр, длина Прочитать указанное число байт из файла в скалярную переменную.Возвращает количество прочитаных байт или неопределенность приошибке. Длина скаляра станет равной количеству считанных байт. Смещениеуказывают если данные нужно поместить не с самого начала строки. readdir директория Возвращает имя следующего файла в директории открытой командойopendir(). В скалярном контексте возвращает все оставшиеся именафайлов. Если файлов больше нет то возвращает неопределенность вскалярном контексте и пустую строку в списковом. readlink выражение Возвращает значение символической ссылки. При ошибкевозвращает неопределенное значение. recv SOCKIT, SCALAR, LEN, FLAGS Получить сообщение из сокита. Аналогичен системному recvfrom(). redo меткаredo Перейти к началу блока минуя вычисление условия и блокаcontinue. Если метка отсутсвует то переход к ближайшему внешнемублоку. ref выражение Возвращает true если выражение это ссылка иначе - false.Возвращаемое значение зависит от типа ссылки. Существуютследующие типы ссылок: REF, SCALAR, ARRAY, HASH, CODE, GLOB Если аргумент - ссылка на класс то возвращается имя класса.Функция ref() аналогична функции typeof(). rename старое_имя, новое_имя_файла Переименовать файл. Возвращает 1 в случае успеха иначе 0. require выражениеrequire Если выражение - число, требует что бы текущая версияПел была не ниже указанной. Если строка - считывает библиотечный файлс указанным именем если он еще не прочитан.Последний оператор библиотечного файла должен возвращать true.Обычно это строка вида 1;Если расширение имени файла отсутсвует то по умолчанию принимается ".pm"В данной функции можно указывать путь расположения файла, а еслибиблиотека расположена в стандартной системной области Пел то вместоrequire предпочтительней использовать use(). reset выражениеreset Обычно используется в блоках continue циклов дляочистки переменных и поиска для повторного применения.Выражение воспринимается как список символов. Для указаниядиаппазона можно применять символ минус '-'.Все переменные и массива начинающиеся с этих символовобнуляются. Если выражение отсутсвует то обнуляестя поиск?шаблон? для повторного поиска. Сбрасываются толькопеременные текущего модуля. Пример: reset 'a'; # очистить все переменные начинающиеся # буквой 'a' reset 'a-z' # все переменные с малых букв. Выражение вида: 'A-Z' употреблять не рекомендуестя т.к.обнуляются важные массивы @ARGV и @ENV. return список Выход из подпрограммы с указанным кодом. Если даннаяфункция отсутсвует то выход из подпрограммы осуществляется скодом последнего выполненного оператора. reverse список В списковом контексте возвращает список с элементамив обратном порядке указанному списку. В скалярном контекстевозвращает строку спереставленными символами первого элементасписка. rewindir директрия Устанавливает указатель файлов открытой директориив начало для последующего чтения функцией readdir(). rindex строка, подстрока, позицияrindex строка, подстрока Подобна функции index , но возвращает позицию последнеговхождения подстроки в строку. Если указана позиция, то просмотрвыполняется до нее. rmdir директория Удалить указанную директорию если в ней нет никаких файлов.Возвращает 1 при успехе и 0 при не удаче. При этом переменная $!содержит код (errno). s/// Оператор подстановки. Смотри главу "Операторы". scalar выражение Вычисляет выражение в скалярном контексте и возвращаетрезультат. В Пел нет специальной функции для принудительноговычисления в списковом контексте т.к. для достаточно заключитьего в круглые скобки. seek файл, позиция, отсчет Установить указатель на произвольную позицию в файле.Если отсчет равен 0 - позиционировать от начала файла, если 1 - оттекущего положения, 2 - от конца файла. Возвращает 1 при успехеи 0 - неудаче. seekdir директория, позиция Установить указатель файла в открытой директории дляпоследующего чтения функцией readdir(). Текущая позицияможет быть получена функцией telldir(). select файлselect Возвращает текущий указатель файла- по умолчаниюили делает текущим указанный. Таким образом если в функцияхprint или write не указан файл вывода то это осуществляетсяв файл указанный select. Переменные связанные с выводом так жедействуют на вывод в этот файл. select RBITS, WBITS, EBITS, TIMEOUT Выполняет системный select() semctl ID, SEMNUM, CMD, ARG Системный вызов semctl() для SYSTEM V. semget KEY, NSEMS, FLAGS Системный вызов semget() для SYSTEM V. semop KEY, OPSTRING Системный вызов semop() для SYSTEM V. send SOCKET, MSG, FLAGS, TOsend SOCKET, MSG, FLAGS Послать сообщение через сокит. Аналогично системному send(). setpgrp PID, PGRP Установить номер группы PGRP процессу с номером PID 0 = для текущего процесса. setpriority WHICH, WHO, PRIORITY Установить приоритет PRIORITY процессу пользователя WHOи группе WHICH. setsockopt SOCKET, LEVEL, OPTNAME, OPTVAL Установить параметры сокита. Воззвращает неопределенностьпри ошибке. shift массивshift Удаляет первый элемент массива и возвращает его значение.Если массив пустой то результат неопределенность. Если аргументопущен - обрабатывается массив @ARGV в головной программеили @_ в подпрограмме. shmctl ID, CMD, ARG Системный вызов shmctl() System V shmget KEY, SIZE, FLAGS Системный вызов shmget() System V shmread ID, VAR, POS, SIZEshmread ID, STRING, POS, SIZE Пишет или читает сегмент общедоступной памяти в System V. shutdown SOCKET, HOW Прекращает работу сокита методом HOW. sin выражение Возвращает в радианах синус выражения. sleep выражениеsleep Приостанавливает работу процесса на указанное число секундили зацикливается если аргумент отсутсвует. Работа продолжается еслиполучен сигнал SIGALARM. Возвращает время фактической паузы. socket SOCKET, DOMAIN, TYPE, PROTOCOL Открывает сокит и привязывает его к указателю SOCKET. socketpair SOCKET1, SOCKET2, DOMAIN, TYPE, PROTOCOL Создает "безымянную" пару сокитов в указаном DOMAIN.Возвращает true при успехе и false - неудаче. sort подпрограмма списокsort блок списокsort список Сортирует элементы списка и возвращает полученныйсписок. Не существующие элементы списка отбрасываются. Если неуказано имя подпрограммы или блок то сортирует в стандартномстроковом порядке. Указанная подпрограмма возвращает значения больше, меньшеили равное нулю в зависимости от двух соседних элементовсписка. Имя подпрограммы может быть указано переменной. Она недолжна быть рекурсивной и два сравниваемых элемента спискапередаются как глобальные переменные $main::a и $main::b. Этоссылки поэтому их изменение приводит к изменению самихэлементов списка. splice массив, смещение, длина, списокsplice массив, смещение, длинаsplice массив, смещение Удаляет элементы массива начиная со смещения и указанной длины.Заменяет их указанным списком. Возвращает удаленный список.Если длина не указана удаляет все элементы списка начиная со смещения. split /шаблон/, выражение, пределsplit /шаблон/, выражениеsplit /шаблон/split Разделяет строку,указанную выражением, на массив элементов и возвращает его.В скалярном контексте возвращает количество полученных элементов массива,а сам массив помещает в @_ (в списковом контексте поместить результатв @_ можно если применить ?шаблон?)Если выражение отсутсвует то обрабатывается содержимое переменной $_.Если шаблон отсутсвует то разделителем является пробел.Все что подходит по шаблону считается разделителем. Если указан пределто это максимальное число разделений. Отрицательное значение пределавоспринимается как неограниченно большой предел.Если пустая строка походит под шаблон разделителя то исходное значениеразделяется по символьно.Предел удобно использовать для частичного разделения строки. Пример: ($a, $b, $остаток) = split(/ /, "Один Два Три Четыре",3); здесь $a = 'Один', $b = 'Два' и $остаток = 'Три Четыре' Если шаблон содержит круглые скобки то символы-разделители указанныев них вставляются в результирующий список как обычные элементы,причем вставляется символ который совпал с разделителем. Пример: @a = split(/([,.])/, "Один,Два.Три"); здесь @a = ("Один", "," ,"Два", ".", "Три") sprintf формат, список Форматирует список по указанному формату аналогичнофункции sprintf() языка С. sqrt выражение Возвращает корень квадратный выражения. srand выражение Задает начальное значение для генератора случайных чиселоператора rand. Если аргумент отсутсвует то используется текущеемашинное время. stat файлstat выражение Возвращает 13 элементный массив параметров указанного файлаили пустой список при ошибке. Применяется обычно следующим образом: ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename); где $dev - имя устройства $ino - номер i-узла $mode - права доступа $nlink - количество связей $uid - идентификатор владельца $gid - идентификатор группы $rdev - тип устройства $size - размер файла в байтах $atime - дата последнего обращения $mtime - дата последней модификации $ctime - дата последнего изменения статуса $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. Строка аргументов используемых описателем. Описатель - это строка которая выводится в виде "как есть" за исключениемспециально обозначенных форматов полей данных. Каждое поле начинаетсялибо символом '@' либо '^'.В описательной строке указывается только положение и видвыводимых данных, но не имена полей и переменных.Для этого предназначена следующая строка аргументов которая следует всегдапосле описателя и содержит имена переменных или целые выраженияв порядке указанном описателем. Размер и вид поля в описателе обозначается следующими символами: ">>>>" - выровнить значение по правому краю. "<<<<" - -//- по левому. "Quot; - -//- по центру. "####.###" - формат числа с точкой. "@*" - многострочная строка. Данные выводятся в колонку. Размер поля равен количеству указанных символов. Символ '^' в начале поля имеет специальное значение. Так: "^####" - пусто если переменная не определена. для строчного скаляра: "^<<<<<" - Выводится сколько возможно символов, а значениепеременной меняется на остаток вывод которого можно продолжить наследующих строках которые могут иметь свои поля. Пример: #!/usr/local/bin/perl## Программа печати пригласительного билета#$кому = "Чапаеву Василию Ивановичу"; $от_кого = "Компания МММ"; $адрес = "Москва, ул. Петровка, д 38"; $текст = "Уважаемый Василий Иванович! Компания МММ имеет честь пригласитьВас и Ваших близких на презентацию наших новых хромовых сапог, сделанныхна уровне мировых стандартов качества и дизайна."; format STDOUT = П Р И Г Л А С И Т Е Л Ь Н Ы Й Б И Л Е Т--------------------------------------------------------------------------------Кому: @<<<<<<<<<<<<<<<<<<<<<<<<<< | ^
Кому, $текст | ^
Дата добавления: 2018-04-04; просмотров: 443; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!