Регулярные выражения (шаблоны)



В данной главе описывается синтаксис регулярных выражений. Чаще всегов Пел они используюстя в операторах поиска и замены таких как 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'.

Операторы и приоритеты

В Пел ассоциативность и приоритетность операторованалогична языку C. Ниже перечислены все операторы в порядкеуменьшения приоритета, в начале строки указана ассоциативность.    ассоц. операторы   ----- ---------------------------   левая термы и левосторонные списковые операторы   левая ->   - ++ --   правая **   правая ! ~ \ унарные + и -   левая =~ !~   левая * / % x   левая + - .   левая << >>   - именованные унарные операторы   - < > <= >= lt gt le ge   - == != <=> eq ne cmp   левая &   левая | ^   левая &&   левая ||   - ..   правая ?:   правая = += -= *= и т.д.   левая , =>   - правосторонние списковые операторы   левая not   левая and   левая or xor Термы и левосторонние списковые операторы. Любой терм имеет самый высокий приоритет. К терму относятсяпеременные, кавычки и их операторы, арифметические и логические выраженияв скобках, любые функции с параметрами в скобках. Фактически такихфункций нет так как это просто унарные и списковые операторы простоони ведут себя подобно функциям с параметрами в скобках. Подробно смотриглаву "Функции".Если после любого спикового оператора ( print(), и т.д.) или унарногооператора (chdir(), и т.д.) следует левая круглая скобка, то операторывнутри скобок имеют наивысший приоритет. Так же как и обычные функции. Если скобки отсутсвуют то приоритет списковых операторов или наивысшийили наименьший в отношении операторов справа или слева от него. Например:    @i = ('a ','b ', print 'c ', 'd ');   print "\n",@i,"\n"; Результат:   c d   a b 1 Здесь мы имеем списковый оператор print. Для запятых слева от него онимеет наименьший приоритет, но повышает приоритет правой запятой.Поэтому правая запятая воспринимается как параметр для print и печатается'c d' а левая просто записывает код завершения операции в массив @iи последний print показывает это. Оператор '->' Так же как в С или С++ это инфиксный оператор переадрессации. Еслисправа от него стоит [...] или {...} выражение, то правая часть можетбыть непосредственной или символической ссылкой на массив или хеш.В противном случае правая сторона это метод или простой скаляр содержащийимя метода, а правая или объект или имя класса. Подробно смотриглаву "Классы". Операторы ++ (инкремент) и -- (декремент). Эти операторы работают так же как и в С. Если оператор стоит передпеременной то значение переменной изменяется на 1 и полученной значениеиспользуется. Если после переменной то ее величина изменяется послеприменения. Употребление инкремента к строковым переменным в Пел имеет одну особенность.Каждый символ остается в своем классе (большие, малые, цифры) и учитываетсяперенос предыдущего символа. Таким образом строковые переменные с цифрамиработают как числовые переменные. Пример:   print ++($i = "09"); # Результат "10"    print ++($i = "a9"); # "b0"    print ++($i = "az"); # "ba"    print ++($i = "aZ"); # "bA" Оператор ** (возведение в степень) Пример:   print 4**2 # Результат 16    print -4**2 # Результат -16 т.е. -(4**2) Унарные операторы.    '!' - логическое отрицание    '-' - арифметический минус    '~' - побитная инверсия (дополнение до 1)    '+' - арифметический плюс    '\' - получение ссылки на переменную (как & в С) Операторы "привязки" =~ и !~ . Эти "необычные" я бы даже сказал оригинальные операторы имеют оченьширокое применение в Пел. Можно даже назвать их "оригинальным" решением.Оператор =~ логически связывает левую часть выражения с патерном (pattern -образец, шаблон, модель) в правой. По умолчанию поиск или изменение попатерну выполняется в переменной $_ Операторы привязки позволяют делать этос любой переменной указанной в левой части. Логическим результатом будетуспех операции. Если в правой части вместо патерна присутсвует выражение,то результат этого выражения воспринимается как патерн. Однако это не оченьэффективно т.к. патерн будет компилироваться во время исполнения программычто заметно снизит быстродействие. Оператор !~ аналогичен =~ толькорезультат совпадения инвентируется (логическое "нет"). Подробное применениеэтих операторов приводится в главе "Патерны". Мультипликативные операторы.    '*' - арифметическое умножение    '/' - арифметическое деление    '%' - арифметический модуль    'x' - оператор повторенияВ скалярном контексте возвращает строку левой части повторенную величинойуказанной в правой части. В списковом контексте, если в левой части списокв круглых скобках - повторенный список. Пример:   print '*' x 5; # Результат '*****'    print (1,2) x 3; # Результат 121212 Аддитивные операторы.    '+' - арифметический плюс    '-' - арифметический минус    '.' - конкатенация (объединение) строк Операторы сдвига.    '<<' - Сдвигает побитно влево значение выражения в левой части          на количество бит указанное в правой.    '>>' - Сдвигает побитно вправо значение выражения в левой части          на количество бит указанное в правой. Именованные унарные операторы. Фактически это функции с одним аргументом. Круглые скобки можно опускать. Операторы отношений.    '<' - арифметическое меньше    '>' - арифметическое больше    '<=' - арифметическое меньше или равно    '>=' - арифметическое больше или равно    'lt' - строковое меньше    'gt' - строковое больше    'le' - строковое меньше или равно    'ge' - строковое больше или равно Операторы равенства.    '==' результат true если левая часть равна правой (равно)    '!=' - не равно    '<=>' - -1 если левая часть меньше правой, 0 если равна,          1 если больше.    'eq' - строковое равно    'ne' - строковое не равно    'cmp' - как и '<=>' применительно к строкам Операторы работы с битами.    '&' - побитное AND    '|' - побитное OR    '^' - побитное XOR Логические операторы && (AND) и || (OR).    '&&' - если левое выражение возвращает false, правое не выполняется.    '||' - если левое выражение возвращает true, правое не выполняется. Отличие от подобных операторов в С заключается в том, что в С возращаемоезначение либо 0 либо 1. Тогда как в Пел возвращается результат выражения. Оператор диапазона '..' Результат работы данного оператора зависит от контекста. Всписковом контексте результат есть список с элементами. Первыйэлемент которого это левое выражение и последнее - правое.Значение каждого элемента внутри списка увеличивается на 1.Данный оператор удобен для небольших циклов т.к. памятьотводится для всего списка целиком. Поэтому будьте внимательныи не задавайте слишком большой диаппазон. Пример:   for $i (1..4)   { print "$i ";   }Результат: 1 2 3 4 В скалярном контексте результат - логическое значение. Каждая '..'операция устанавливает свое собственное состояние. Это falseдо тех пор пока левый операнд false. Как только левый операндстал true результат - true до тех пока правый true, после чегорезультат опять - false. Если вы не хотите проверять правый операндто используйте оператор '...'.Правый операнд не вычисляется пока результат false и левыйоперанд не вычисляется пока пока результат true. Приоритетностьоператора '..' немного ниже чем '&&' и '||'. Возвращаемоезначение если flase - нулевая строка, если true - порядковый номерначиная с 1. Порядковый номер обнуляется для каждого нового диаппазона.Последний порядковый номер добавляется строкой "E0" которая не изменяетего значение но позволяет фиксировать последнее значение. Пример:   @алфавит = ('a'..'z'); # Массив малых букв латинского алфавита    @цифры = (0..9);  # Массив цифр Условный оператор '?:' Этот оператор работает так же как и в С. Если выражение перед '?'истинно то выполняется аргумент перед ':' - иначе после ':'. Пример:   $i = 1;   $i > 1 ? print "больше" : print "меньше"; Результат: меньше Операторы присваивания.    '=' - обычный оператор "присвоить" правое значение переменной слеваВся эта группа операторов подобна операторам С т.е.    $i += 2;эквивалентно   $i = $i + 2;Остальные операторы этой группы работают аналогично.Допустимы следующие операторы:    **=   += -= .=   *= /= %= x=   &= |= ^=   <<= >>=   &&= ||= Приоритет всей этой группы операторов равен приоритету '='. Оператор ',' (запятая) В скалярном контексте выполняется левый аргумент, результат игнорируетсязатем правый и его результат есть результат действия оператора.В списковом контексте это разделитель элементов списка которыйвключает указанные элементы в список. Оператор логическое not (орицание). Унарный not возвращает противоположное значение полученное выражениемсправа. Он эквивалентен '!' но имеет очень низкий приоритет. Оператор логическое and (И). Выполняет логическую конъюнкцию двух выражений. Эквивалентен '&&'но имеет очень низкий приоритет и "краткость" действия. т.еесли левое выражение равно false - левое не выполняется. Логическое or (ИЛИ). Выполняет логическую дизъюнкцию двух выражений. Эквивалентен '||'но имеет очень низкий приоритет и "краткость" действия. т.еесли левое выражение равно true - левое не выполняется. Логическое xor (исключающее ИЛИ).Выполняет логическое исключающие или. Всегда выполняются обаправое и левое выражение. С операторы отсутствующие в Пел. В Пел отсутсвуют операторы языка С такие как:   унарное & - получить адрес. Для этого применяется '\'.    унарный * - переадресация.    (TYPE)    - совмещение типов. Операторы ограничители строк. Обычно ограничители строк мы считаем литералами, но в Пел это операторывыполняющие разного рода интерполяцию и поиск по шаблону. Вы можетесами задавать удобные для вас ограничители. В следующей таблицеприведен полный перечень вариантов. Фигурные скобки '{}' обозначаютлюбой символ используемый для ограничителя. В случае использованияскобок (круглых '()', квадратных '[]', фигурных '{}', угловых '<>')в начале ставится открывающаяся скобка а в конце закрывающая. По умолчанию Полное Функция Интерполяция ---------- ------ ------------ ----   '' q{} Literal   нет   "" qq{} Литерал   да   `` qx{} Команда   да          qw{} Список слов нет   // m{} Шаблон    да          s{}{} Подстановка да          tr{}{} Трансляция нет В строках допускающих интерполяцию имена переменных начинающиеся ссимволов '$' или '@' - интерполируются т.е. в строку вставляетсязначение строки или массива.Данные последовательности символов имеют специальное значение:    \t символ табуляции   \n символ новой строки   \r возврат   \f перевод формата   \v вертикальная табуляция   \b backspace (забой)   \a звонок   \e escape   \034 восьмеричный символ   \x1a шестьнадцатеричный символ   \c[ символ управления   \l нижний регистр следующего символа   \u верхний регистр следующего символа   \L нижний регистр для всех символов до \E   \U верхний регистр для всех символов до \E   \E ограничитель смены регистра   \Q отмена действия метасимволов до \E Шаблоны интерполируются как регулярные выражения. Это выполняетсявторым проходом после интерполяции переменных поэтомув шаблоны можно вставлять переменные. Для отмены интерполяциииспользуйте '\Q'. Если вы применяете вложенные ограничители товнутренние ограничители работать не будут. ?PATERN?Действие этого оператора аналогично /шаблон/ но выполняетсядо первого совпадения. Это удобно для поиска наличия какойнибудь строки в одном или множестве файлов. Это не оченьудачный оператор поэтому в следующих версиях Пел еговозможно не будет. m/PATERN/gimosx/PATERN/gimosxПоиск в строке по патерну (шаблону). В скалярном контексте возвращаетлогическое значение true (1) или false (''). Если строка не указанас помощью операторов '=~' или '!~' поиск ведется в строке $_ Опции:   g  - Глобальный поиск. Поиск всех вхождений.   i  - Сравнение не зависит от регистра (верхний или нижний)   m  - Строка многострочна.   o  - однопроходная компиляция   s  - однострочная строка   x  - используеются расширенные регулярные выражения. Если '/' - ограничитель то начальное 'm' можно опустить. С помощьюнего в качестве ограничителя может быть любой символ кроме пробела. PATTERN может содержать переменные которые будут интерполироваться(перекомпилироваться) каждый раз в момент вычисления.Переменные $) и $| не интерполируются. Если вы хотите что бытакой шаблон интерполировался один раз - добавьте /o.Это необходимо делать в циклах поиска для увеличения быстродействияоднако если вы измените значение переменной Пел этого даже не заметит. Если PATERN - нулевая строка то используется последнее регулярноевыражение. В скалярном контексте возвращается список элементы которогорезультаты выполнения выражений в скобках патерна ($1, $2, $3...).Обратите внимание что первый елемент $1. Пример:   $a = "/usr/local/perl/perl.bin"; # Анализируемая строка Цель: Создать массив @dirs с именами директорий. Решение:   Самый простой способ воспользоваться split('\/')   но в качестве примера используем скобки.    @dirs =~ m[/(\w*)/(\w*)/(\w*)/(\w*)] Здесь 'm[' - использовать квадратные скобки как ограничители.(\w*) - шаблон алфавитноцифровой последовательности. В результате @dirs равен ('usr', 'local', 'perl') q/строка/'строка'   Строка литералов. Не интерполируется. Внутри строки разрешается использовать\' или \\ для обозначения символов ' и \ . Пример:   print q#Привет.#; # Результат Привет.    print 'O\'K';     # O'K qq/строка/"строка"   Интерполируемая строка. Пример:   $var = 13;   print "\$var = $var"; Результат:   $var = 13 qx/строка/`строка`   Сначало строка интерполируется а потом выполняется как   системная команда. Пример:   print `date`; Результат:   Thu Nov 14 13:36:49 MSK 1996 qw/строка/   Возвращает список элементы которого - слова строки разделенные   пробелами. Пример:   print qw/Построемся и спасемся!/; # ('Построемся','и','спасемся!') Результат:   Построемсяиспасемся! Часто применяется как:   use POSIX qw( setlocale localeconv )   @EXPORT = qw( proc1 var ); s/шаблон/подстрока/egimosx   Поиск по шаблону и в случае успеха замена подстрокой.   Возвращает количество произведенных подстановок иначе false (0).Если строка в которой ведестя поиск не указана (операторы =~ или != )то используется переменная $_ .Если в качестве раделителя '/' исрользовать одинарную кавычку (')то интерполяции не будет иначе можно применять переменные в шаблонеили подстроке. Опции:    e  - Расмматривать правую часть как выражение.   g  - Глобальный поиск.   i  - Без различия регистра букв   m  - многосточная переменная   o  - компилировать шаблон один раз   s  - однострочная переменная   x  - расширенное регулярное выражение Разделитель '/' можно заменить на любой алфавитно-цифровой символкроме пробела. Пример:   $var = "12345"; # исходная строка   $var =~ s/1/0/; # Заменить '1' на '0'. Результат 02345   $var =~ s(5)(.); # Заменить '5' на '.' Результат 0234. Здесь в качестве разделителя применены скобки поэтому подстрокавзята в две скобки.    $var =~ s/\d*/каламбур/; Заменить все цифры. Результат 'каламбур.'    $var =~ s/а/о/g; # Заменить все 'а' на 'о'. Результат 'коломбур.'    $var = "12 34"; # Новое значение    $var =~ s/(\d\d) (\d\d)/$2 $1/; # Поменять местами числа. Результат '34 12'. tr/таблица1/таблица2/cdsy/таблица1/таблица2/cds    Замена всех символов из "таблица1" на соответсвующий символиз "таблица2". Результат - количество замен или стираний. Без оператора=~ или != операция выполняется с строкой $_. Для совместимости с программойsed вместо tr можно писать 'y'. Опции:   c  - дополнение "таблица1"   d  - стереть найденные но не замененные символы.   s  - "зжать" повторяющиеся замененные символы. Если указана опция /d таблица2 всегда интерпретируется как положено.Другими словами если таблица2 короче чем таблица1 то символ из таблицы1интерпретируется всегда. Если таблица2 - null то все символы строкиостаются не изменненные. Это удобно для подсчета количества сиволовв строке определенного класса или для сжатия повторяющихся символовнапример пробелов. Пример:   $s = "hello"; # Исходная строка    $s =~ tr/a-z/A-Z/; # Заменить малые буквы на большие. Результат                          # 'HELLO'    $s = 'Hel....lo';   $s =~ tr/a-zA-z/_/c; # Заменить все не буквы на '_'                          # Результат 'Hel____lo'   $s =~ tr/_/ /s;   # Заменить '_' на ' ' и сжать.                          # Результат 'Hel lo'   $s =~ tr/a-zA-Z /a-zA-Z/d; # Удалить все не буквы. Результат 'Hello' Если один и тот же символ несколько раз указан в таблице1 то применяетсятолько первая замена. Операторы ввода-вывода. В Пел существует несколько операторов ввода-вывода. Первый это скобкииз символа '`' - акцента. Строка в этих скобках воспринимается каксистемная команда и результат ее действия возвращается как "псевдо"литерал. В скалярном контексте это строка содержащая весь результат,а в списковом - список элементы которого - строки результата.Статус выполненой команды хранится в переменной $? . Следующая команда ввода вывода выгледит как '<файл>'.Вычисление <файл> приводит к чтению строки из файла. Обратите вниманиечто 'файл' здесь не имя файла а указатель файла который создаетсяфункцией open(). В скалярном контексте читается одна строка вместес символом '\n' - перевода строки, а в списковом весь файл читаетсяв список элементы которого суть строки файла.В случае обнаружения конца файла результат оператора не определени воспринимается как false. Если не указана переменная результатато по умолчанию это $_. Указатель файла по умолчанию STDIN -стандартный ввод. Пример:   while(<>) { print; }; # Прочитать и вывести весь файл STDIN У оператора '<>' есть одна отличительная особенность. Если в команднойстроке нет никаких аргументов то читается стандартный ввод, еслиесть аргументы то они считаются именами файлов которые последовательночитаются.Если в угловых скобках записана переменная то содержимое этойпеременной считается именем указателя файла или ссылкой науказатель файла. Если такого указателя не существует то содержимоепеременной воспринимается как шаблон имен файлов и результат- имена файлов на диске подходящих по шаблону. Пример:   while(<*.pl>) { print;}; # То же что и ls *.pl    @files = <*>; # Массив @files содержит имена файлов в директории но лучше сделать: @files = glob("*"); т.к. внутри скобок можно использоватьпеременные. Слияние констант. Как и С Пел выполняет возможные вычисления в период компиляции.Так подстановка символов после '\' , операция конкатенации строк,арифметические выражения содержащие только одни константы, все этоделается в момент компиляции что существенно увеличивает скоростьвыполнения программы. Целочисленная арифметика. По умолчанию Пел выполняет арифметику с плавающей запятой, ноесли вы укажете:    use integer; то компилятор будет использовать целочисленную арифметику доконца текущего блока, хотя вложенный блок может это и отменитьв своих пределах с помощью:    no integer;

Встроенные функции

Встроенные функции используются как термы выражений иподразделяются на две категории: списковые операторы и унарныеоператоры. Это влияет на их приоритет по отношению к оператору',' - запятая. Списковые операторы могут именть множество(список) аргументов, а унарные только один. Таким образомзапятая завершает аргументы унарного оператора и разделяетаргументы спискового. Аргумент унарного оператора воспринимается обычно вскалярном контексте а спискового как в скалярном так исписковом причем скалярные аргументы идут первыми. В дальнешемсписковые аргументы мы будем обозначать словом '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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!