Программирование |
Web мастеру |
3D Графика и анимация |
Сетевая безопасность |
Гостевая книга |
Форум |
Ссылки |
Услуги |
|
|
На главную страницу > > В раздел программирование > > В раздел PERL |
Спецификация языка PERL. |
Perl - интерпретируемый язык, приспособленный для
обработки произвольных текстовых файлов, извлечения из них необходимой
информациии и выдачи сообщений. Perl также удобен для написания различных
системных программ. Этот язык прост в использовании, эффективен, но про него
трудно сказать, что он элегантен и компактен. Perl сочитает в себе лучшие черты
C,
shell,
sed и
awk, поэтому для тех, кто знаком с
ними, изучение Perl-а не представляет особого труда. Cинтаксис выражений Perl-а
близок к синтаксису C. В отличие от
большинства утилит ОС UNIX Perl не
ставит ограничений на объем обрабатываемых данных и если хватает ресурсов, то
весь файл обрабатывается как одна строка. Рекурсия может быть произвольной
глубины. Хотя Perl приспособлен для сканирования текстовых файлов, он может
обрабатывать так же двоичные данные и создавать .dbm файлы, подобные
ассоциативным массивам. Perl позволяет использовать регулярные выражения,
создавать объекты, вставлять в программу на
С или
C++ куски кода на Perl-е, а также
позволяет осуществлять доступ к базам данных, в том числе
Oracle. Ниже приводится в качестве примера небольшая программа, которая осуществляет доступ к Oracle. #! /usr/local/bin/perl -w # запуск с
ключом печати ошибок.
2. Cтруктуры данныхPerl поддерживает три типа данных:
$ , даже в том
случае, когда мы обращаемся к элементу массива.
?Простой массив начинается со знака @ :
?Ассоциативный массив (хэш) начинается со знака процент % :
2.1. Скалярные величиныСкалярные переменные могут содержать различные простые типы данных, такие как числа, строки или ссылки. Они не могут содержать сложные типы, но могут содержать ссылку на массив или хэш. В булевском контексте скаляр принимает значениеTRUE , если он
содержит не нулевое число или не пустую строку. В Perl существует несколько
способов записи чисел:
?Строки заключаются в одинарные или двойные кавычки. Использование кавычек в Perl такое же как в bourne
shell -е: строка в двойных кавычках обрабатывается и
вместо переменных подставляются их значения, а также обрабатываются
бакслэш-последовательности, строки в одинарных кавычках рассматривается просто
как последовательности символов. Используются также:
? 2.2. Простые массивыPerl позволяет произвольно удлинять массив путем обращения к элементу, индекс которого больше, чем последний индекс массива. Так же можно произвольно уменьшить длину массива.
2.3. Ассоциативные массивыАссоциативные массивы или хэши содержат пары ``ключ'' и ``значение''. Например:\%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);Часто для удобства чтения между ``ключом'' и ``значением'' ставят оператор =>. %map = ( 'red' => 0x00f, 'blue' => 0x0f0, 'green' => )xf00 ); 3 Синтаксис языка Perl3.1 Основные понятияПрограмма на Perl-е состоит из последовательности команд. В отличие от типизированных языков Perl не требует объявления типов своих объектов. Все объекты, определенные в программе, до присваивания им какого-либо значения по умолчанию принимают значение ``0''. Последовательность команд исполняется сразу, в отличие отsed и
awk , где исполняется
последовательно каждая строка. Комментарии выделяются знаком
# , и вся строка следующая за этим
знаком будет рассматриваться как комментарий. Если вы написали подпрограмму, то
ее можно вызывать только ниже по тексту программы. Блоком называется
последовательность операторов, логически составляющая единое целое в теле
программы, как правило, блоки заключаются в фигурные скобки. Каждая команда
отделяется от других точкой с запятой. Точка с запятой не обязательна, только
если оператор является последним в блоке.
3.2 Простые операторыПоследовательность простых операторов может следовать за отдельным модификатором. В Perl-е простыми модификаторами являются:
do { $_ = <STDIN>; ... } until $_ eq ".\n";в котором проверка условия происходит после выполнения блока. Операторы цикла, которые будут описаны далее, не будут работать в этой конструкции, так как отсутствует метка цикла. 3.3 Составные операторыif (EXPR) BLOCK $i = 1; while ($i < 10){ ... } continue { $i++; }или, что тоже самое: for ($i = 1; $i < 10; $i++;) { ... }Foreach цикл присваивает переменной по очереди каждое значение из списка и выполняет над ней все команды из блока. Переменная является локальной и существует только в пределах данного цикла. Если список является массивом, то его можно изменять в цикле, посредством операций над переменной. Если переменная опускается, то по умолчанию в качестве нее используется $_ .
foreach \$elem(@elements) \{\$elem = \$elem * 2;\}-- цикл по всему содержимому массива @items. Пример: for ((1,2,3,4,5,6,7,8,9,10,'boom')) { print $_,"\n"; sleep(1); } for (1..15) { print "Merry Christmas\n"; } foreach $item (split(/[\/\*\\n]/,$ENV{'TERMCAP'})) { print "Item: $item\n"; }Блок семантически эквивалентен циклу, который исполняется один раз. Поэтому в него можно включать операторы контроля цикла, чтобы выйти из него или запустить его еще раз. 3.4 Операторы языка Perl3.4.1 Термы и операторы спискаОператоры в Perl-е имеют различный приоритет. Операторы, заимствованные изC ,
сохранили между собой ту же иерархию, что и в
C . Термы имеют самый большой
приоритет, они содержат переменные, кавычки, выражения в скобках, функции с их
параметрами. Если за списковым оператором ( например,
print()) или унарным оператором (
например, chdir()) следует список
аргументов, заключенный в скобки, то эта последовательность имеет самый высокий
приоритет, подобно функции с аргументами. Аналогично термам обрабатываются
последовательности do{} и
eval{} .
3.4.2 Оператор ``стрелка''Также, как вС и
С++
``-> '' является инфиксным
оператором ссылки. Если правая часть является [...] или {...} подпрограммой,
тогда левая часть должна быть символьной ссылкой на массив или хэш. Если правая
часть - это имя метода или скалярная переменная содержащая имя метода, то левая
часть должна быть объектом или именем класса.
3.4.3 Операторы ++ и - -Эти операторы работают также как и вС . То есть, если они стоят перед
переменной, то они увеличивают или уменьшают переменную до возвращения значения.
Если они стоят после переменной, то увеличение или уменьшение переменной
происходит после возврата значения. Если переменная содержит в себе число или
употребляется в скалярном контексте, то использование
++ дает обычное увеличение
значения. Если же переменная употреблялась только в строковом контексте, не
является пустой строкой и содержит символы
a-z,A-Z,0..9 , то происходит
строковое увеличение значения переменной:
print ++($foo = '99'); - напечатает
3.4.4 Экспоненциальный операторВ Perl-е двойная звездочка** является экспоненциальным
оператором. Он требует к себе даже больше внимания, чем унарный минус:
-2**4 это
-(2**4) , но не
(-2)**4 .
3.4.5 Символьные унарные операторыУнарный! означает логическое отрицание.
Унарный минус, в случае числового значения переменной, обозначает обычное
арифметическое отрицание. Если операндом является идентификатор, то возвращается
строка, состоящая из знака минус и идентификатора. Если строка начинается со
знака + или
- , то возвращается строка,
начинающаяся с противоположного знака. Унарная тильда
``~ '' обозначает побитовое
отрицание.Унарный плюс не имеет влияния даже на строки. Он используется для отделения имя функции от выражения заключенного в скобки, которое иначе рассматривается как список аргументов. rand (10) * 20; - (rand10) * 20; rand +(10) * 20; - rand(10 * 20);Унарный бэкслэш ``'' обозначает ссылку на то, что стоит за ним. 3.4.6 Операторы связкиЗнак равенства с тильдой ``=~ ''связывает выражение слева с
определенным шаблоном. Некоторые операторы обрабатывают и модифицируют
переменную $_ . Эти же операции
иногда желательно бывает выполнить над другой переменной. Правый аргумент это
образец поиска, подстановки или трансляции, левый аргумент - это то, что должно
быть подставлено вместо $_ .
Возвращаемая величина показывает успех операции. Бинарное
``!~ '' это тоже самое, что и
``=~ '', только возвращаемая
величина является отрицательной в логическом смысле.
3.4.7 Бинарные операторыЗвездочка* - умножение двух чисел. Cлэш
/ - деление числа на число.
Процент % - вычисляет модуль двух
чисел, x - оператор повторения. В
скалярном контексте возвращает строку, состоящую из многократно повторенного
левого операнда, причем повторяется он то количество раз, которое стоит справа.
В списковом контексте он многократно повторяет список.
print 'a' x 80; напечатает букву
a 80 раз.
@ones = (1) x 80; массив из восьмидесяти
единиц. 3.4.8 Операторы сдвигаДвоичный сдвиг осуществляется, как и во многих других языках программирования, с помощью операторов ``<<'' и ``>>''. При применении этих операторов значения левых аргументов сдвигаются в соответствующую сторону на количество разрядов, указанное в правых аргументах. Аргументы должны быть целочисленными.3.4.9 Операторы сравнения``<'' - возвращает TRUE если левый аргумент численно меньше, чем правый.``>'' - возвращает TRUE если правый аргумент численно меньше, чем левый. ``<='' - возвращает TRUE если правый аргумент численно меньше или равен левому. ``>='' - возвращает TRUE если левый аргумент численно меньше или равен правому. ``gt'' - возвращает TRUE если левый аргумент меньше (в строковом контексте), чем правый. ``lt'' - возвращает TRUE если правый аргумент меньше (в строковом контексте), чем левый. На поведение операторов lt и
gt влияют установки системного
языка, если операционная система способна работать с несколькими языками. По
этой причине операторы должны корректно работать со строками на языках, отличных
от US ASCII , что в системе
UNIX задается указанием свойств
LC_COLLATE системного
locale .
3.4.10 Операторы эквивалентности== возвращает
TRUE , если левый аргумент
численно эквивалентен
правому.!= возвращает
TRUE , если левый аргумент
численно неэквивалентен правому.<=> возвращает -1, 0 или 1 в зависимости от того, численно меньше, равен или больше левый аргумент правого. eq возвращает
TRUE , если левый аргумент
эквивалентен правому (в строковом
контексте).ne возвращает
TRUE , если левый аргумент
неэквивалентен правому (в строковом
контексте).cmp возвращает -1,
0 или 1 в зависимости от того, меньше равен или больше левый аргумент правого (в
строковом контексте).3.4.11 Побитовое И, побитовое ИЛИ и Исключающее ИЛИБинарное& возвращает объединенные
побитово операнды. Бинарное | возвращает перемноженные побитово операнды. Бинарное ^ возвращает
исключенные побитово операнды. 3.4.12 Логическое И и логическое ИЛИБинарное&& - логическое И. Если
левый аргумент FALSE , то правый
не проверяется. Бинарное || - логическое ИЛИ. Если левый аргумент TRUE , то правый аргумент не
проверяется. ||''и && отличаются от подобных
операторов в \verb C| тем, что вместо 0 или 1 они
возвращают последнюю обработанную величину. Таким образом, наиболее удобным
способом определить домашний каталог пользователя из переменной окружения
HOME будет (на практике такой
способ определения домашнего каталога пользователя не рекомендуется):
$home = $ENV{'HOME'} || $ENV{'LOGDIR'} || (getpwuid($<))[7] || die "You're homeless!\n";В качестве более удобной для чтения альтернативы Perl поддерживает операторы and и
or , которые будут описаны далее.
Их приоритет ниже, однако их можно с удобством использовать, не расставляя
скобки, после операторов, аргументами которых являются списки:
unlink "alpha", "beta", "gamma" or gripe(), next LINE;Если писать в стиле C , то это может быть записано
так:
unlink("alpha", "beta", "gamma") || (gripe(), next LINE); 3.4.13 Оператор диапазона.. - оператор диапазона.
Реально это два разных оператора, в зависимости от контекста. В списковом
контексте он работает как оператор диапазона от левого аргумента до правого.
for (1..10) { #code }В скалярном контексте он возвращает булевское значение. Если левый операнд TRUE , то
.. принимает значение
TRUE , если правый операнд тоже
TRUE .
if (101..200) { print 'hi;)';}- напечатает вторую сотню строк 3.4.14 Условный оператор?: также как и в
C является условным оператором.
Он работает подобно if-then-else .
Если аргумент перед ? -
TRUE , то возвращается аргумент
перед : , в противоположном случае
возвращается аргумент после : .
Скалярный или списковый контекст второго и третьего аргументов передается по
наследству.
($a_or_b ? $a : $b) = $c; 3.4.15 Операторы присваивания= - обычный оператор
присваивания. Вообще операторы присваивания работают также как и в
C . $a +=
2; - то же самое, что и $a = $a +
2; Можно использовать следующие сокращения:
**= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x=
3.4.16 Оператор ``запятая'', - оператор запятая или
comma-оператор. В скалярном контексте он обрабатывает левый аргумент и
отбрасывает его значение, потом обрабатывает правый аргумент и возвращает его
величину. В этом он подобен comma-оператору из
C . В списковом контексте он
играет роль разделителя аргументов и вставляет оба аргумента в список. =>
является синонимом comma-оператора.
3.4.17 Логическое НЕУнарноеNOT возвращает отрицание
аргумента. Оно эквивалентно ! , за
исключением более низкого приоритета.
3.4.18 Логическое И, ИЛИ и Исключающее ИЛИand возвращает конъюнкцию
двух выражений. Он эквивалентен
&& , за исключением более
низкого приоритета. or возвращает
дизъюнкцию аргументов. Он эквивалентен ||, за исключением более низкого
приоритета. xor (eXclusive OR) -
исключающее ИЛИ, возвращает истину, если истинен ровно один из аргументов.
3.4.19 Оператор чтения из файлаВ Perl есть несколько операций ввода-вывода. Для вывода из файла используется команда <>.open(STDIN,"/etc/passwd"); while ($string = <STDIN>) { @a = split(/[:]/,$string); }Внутри этих скобок стоит дескриптор файла. Считывание происходит построчно. В конце файла <STDIN> принимает значение
FALSE и цикл
while завершается. По умолчанию
считывание происходит в переменную
$_ . Нулевой дескриптор файла
используется также как в sed и
awk , то есть считывается поток из
файлов перечисленных в командной строке.
3.4.20 Оператор замены строкиОператорs/PATTERN/REPLACEMENT/egimosx
производит поиск строки, соответствующей шаблону
PATTERN и если строка найдена, то
подстановку на ее место текста
REPLACEMENT . Возвращает
количество произведенных подстановок. Если перед этим не использовался оператор
=~ или
!~ для определения переменной,
которая будет обрабатываться, то будет модифицироваться переменная
$_ . Этот оператор используется со
следующими опциями:
$path =~ s|/usr/local/bin|/usr/bin|; ($foo = $bar) =~ s/this/that/o; $count = ($paragraf =~ s/Mister\b/Mr./gm); 3.4.21 Оператор замены множества символовtr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds Заменяет все найденные
символы из множества символов
SEARCHLIST на соответствующие
символы из множества символов
REPLACEMENTLIST . Возвращает число
символов, которые были заменены или удалены. Если посредством операторов
=~, !~ не была указана никакая
строка, то обрабатывается переменная
$_ .
y является синонимом
tr . Если
SEARCHLIST заключен в скобки, то
REPLACEMENTLIST тоже заключается
в скобки, которые могут отличаться от тех, в которые заключается шаблон,
например:
tr[A-Z][a-z] tr(+-*/)/ABCD/Этот оператор употребляется со следующими опциями:
$a = 'CCCCCCCCC'; $a =~ tr/C/D/s; 4 Языковые конструкции Perl4.1 Ссылки4.1.1 Основные понятияВ предыдущих версиях Perl была реализована возможность только символьных ссылок. Perl версии 5 и выше позволяет использовать не только символьные ссылки на переменные, но и ``жесткие'' ссылки на любые данные. Так как любой скаляр может быть ссылкой, а массивы и хэши состоят из скаляров, то можно с легкостью организовать массив массивов, массив хэшей, хэш массивов и так далее. ``Жесткие'' ссылки следят за счетчиком ссылки и как только счетчик становится равным нулю, автоматически удаляют ссылку. Символьные ссылки содержат только имя переменной, также как символьная ссылка файловой системы содержит просто имя файла. Ссылки могут быть созданы несколькими способами:
Чтобы извлечь информацию, на которую указывает ссылка, тоже существует несколько методов:
ref() может быть использована для
определения типа объекта, на который указывает ссылка. Функция
bless() может быть использована
для ассоциирования ссылки с пакетом, функционирующим как объектный класс.
4.1.2 Символьные ссылкиМы рассмотрели, что происходит, если величина, используемая в качестве ссылки, не была определена ранее. Что же происходит, если она уже определена и не является жесткой ссылкой? В таком случае она обрабатывается как символьная ссылка. То есть значение скаляра рассматривается как имя переменной, а не прямая ссылка на переменную.? 4.2 Регулярные выраженияPerl позволяет использовать регулярные выражения. Для того чтобы пояснить, что же представляет из себя регулярное выражение приведем несколько примеров:/SWAP.*/ -
соответствуют все слова начинающиеся со
SWAP и заканчивающихся
произвольным набором символов. Точка обозначает произвольный символ, звездочка -
то, что символ, стоящий перед ней, входит в слово 0 и более раз. Все
метасимволы, которые будут описаны ниже, бозначают вхождение того, что стоит
перед ними./\w*/
- соответствуют слова состоящие только из алфавитных,
цифровых символов и символа подчерк.
\w - соответствует алфавитным,
цифровым символам и символу подчерк, звездочка - тому, что эти символы могут
входить произволное количество раз. Здесь мы приведем только основные
метасимволы. Для более подробной информации смотрите соответствующие страницы
man по Perl.
?Метасимвол * эквивалентен
{0,} ,
+ эквивалентен
{1,} и
? эквивалентен
{0,1} . Ограничений на величину m
и n нет. Эта стандартная конструкция работает в ``жадном'' режиме, то есть:
регулярному выражению a.*b будет
соответствовать всевозможный набор слов начинающихся с символа
a и кончающихся символом
b , в том числе слова типа
abcab . В таких словах есть
подпоследовательности символов, которые также удовлетворяют условиям регулярного
выражения. Если после каждого из описанных метасимволов поставить знак
? , то подобные последовательности
будут опускаться. Шаблоны обрабатываются как строка в двойных кавычках, поэтому
приведенные ниже последовательности также будут обрабатываться:
? А также все перечисленные ранее бакслэш-последовательности. В Perl-е определены также: ?Обратите внимание, что \w отмечает только отдельные
символы, а не все слово. Чтобы отметить все слово нужно использовать
\w+ . Также определены следующие
команды:
?При использовании конструкции типа ( ... ), \<digit> подставляет
подстроку из скобок с номером
digit . Можно использовать скобки
для отделения подшаблона. Если в скобках имеется более, чем 9 подстрок, то
переменные $10 ,
$11 , ... содержат соответствующие
подстроки. $+ возвращает то, чему
соответствует последняя конструкция в скобках.
$& возвращает подставленную
строку. $` возвращает все перед
подставленной строкой, $'
возвращает все после подставленной строки.
$_ = 'abcdefghi'; /def/; print "$`:$&:$'\n"; - напечатает abc:def:ghiНа этом мы закончим описание регулярных выражений, для более подробной информации читайте manual
page .
4.3 Зарезервированные переменныеВ Perl есть имена имеющие специальное значение. Многие из них аналогичны зарезервированным именам вshell . Если вы хотите использовать длинные имена переменных, в заголовке программы требуется сказать: use English; Многие переменные доступны только для чтения, то есть при попытке присвоения такой переменной какого-либо значения напрямую или по ссылке происходит ошибка. $_ - В эту переменную по умолчанию происходит ввод, присваивание, в нее складываются результаты поиска по заданному образцу. while(<>){...} или, что то же самое: while($_= <>) {...}$<digit> - Эта переменная была описана в предыдущем параграфе. Она доступна только для чтения, так же как и переменные $& ,
$` ,
$' и
$+ .
$. - Эта переменная содержит номер строки, которая была
почитана последней из файла, который был прочитан последним. Она также доступна
только для чтения.
$/ - Содержит символ по которому разделяются вводимые
записи. По умолчанию содержит символ перевода строки. Она похожа на переменную
RS из
awk .
$| - По умолчанию имеет значение 0. Если содержит
ненулевое значение, то происходит сброс буферов каждый раз после осуществления
вывода (на печать, на экран и т.д.).
$, - Содержит символ-разделитель полей для оператора
печати. Подобна переменной OFS в
awk .
$ - Содержит символ-разделитель записей для оператора
печати. Подобна переменной ORS в
awk . (Вы можете определить $
вместо того, чтобы печатать n в конце печати.)
$" - Подобна переменной
$, . Но используется при обращении
к списку величин в двойных кавычках (или другой строке, которая требует
интерпретации). По умолчанию содержит символ пробел.
$; - Содержит символ-разделитель для эмуляции
многомерных хэшей. Если ссылаться на такой элемент хэша как
$foo{$a,$b,$c} то реально это
будет происходить так:
$foo{join($;,$a,$b,$c)} . Не
путайте с @foo{$a,$b,$c} , так как
это тоже самое,
что($foo{$a},$foo{$b},$foo{$c}) .
По умолчанию содержит значение
\034 такое же как переменная
SUBSEP в
awk .
$# - Формат для печати чисел. Подобна переменной
OFMT в
awk . Первоначально содержит
значение %.20g.
$% - Содержит номер текущей выводимой страницы.
$= - Содержит длину текущей страницы (количество
печатных срок), обычно содержит значение 60.
$- - Содержит значение, определяющее количество
оставшихся на странице строк, например количество еще не напечатанных строк для
печатного канала вывода.
$~ - Содержит имя текущего формата сообщений. Обычно
имя дескриптора файла.
$^ - Содержит имя текущего формата заголовка страницы.
Обычно содержит имя дескриптора файла с добавлением в конце
_TOP
$: - Содержит множество символов после которых вывод
сроки может быть прерван и начат снова после перевода строки.
$! - Если эта переменная используется в числовом
контексте, то содержит текущее значение errno (номер ошибки) со всеми обычными
сообщениями. В строковом контексте содержит соответствующее системное сообщение
об ошибке.
$@ - Содержит сообщение о синтаксической ошибке,
допущенной во время исполнения последней команды
eval() . Если содержит значение 0,
то команда была исполнена корректно. Но заметьте, что сообщения не накапливаются
в этой переменной.
$$ - Содержит идентификатор текущего процесса.
$< - Содержит идентификатор пользователя (UID),
которому принадлежит текущий процесс.
$> - Содержит эффективный UID текущего процесса.
$( - Содержит идентификатор группы (GID) пользователя,
которому принадлежит текущий процесс.
$) - Содержит эффективный GID текущего процесса.
$0 - Содержит имя файла, в котором находится
исполняемая программа.
$ARGV - Содержит имя текущего файла, из которого
происходит чтение.
@ARGV - Содержит массив аргументов командной строки,
которые были переданы программе.
@INC - Содержит список точек входа в программу, в
которых используются конструкции do
EXPR ,
require и
use .
%INC - Содержит входы для каждого файла, который
включается посредством использования операторов
do или
require . Ключами являются имена
файлов, а значениями места их расположения.
%ENV - Содержит текущее окружение процесса. Изменением
содержимого хэша можно изменить окружение порожденного (дочернего) процесса.
%SIG - Этот хэш используется для установки обработчиков
различных сигналов. Например:
sub handler { local($sig) = @_; print "Caught a SIG$sig - shutting down\n"; close(LOG); exit(0); } $SIG{'INT'} = 'handler'; $SIG{'QUIT'} = 'handler'; ... $SIG{'INT'} = 'DEFAULT'; $SIG{'QUIT'} = 'IGNORE'; 4.4 Встроенные функцииabs VALUE - Возвращает абсолютное значение аргумента. accept NEWSOCKET, GENERICSOCKET - подобно системному вызовуaccept(2) ждет соединения.
Возвращает запакованный адрес, если соединение произошло успешно и
FALSE в противоположном случае.
atan2 Y,X - Возвращает
arctg(Y/X) .
bind SOCKET, NAME - Привязывает сетевой адрес к сокету,
также как системный вызов bind в
OS UNIX или любой другой системе,
поддерживающей BSD Sockets . Если
привязка произошла успешно, возвращает
TRUE , в противном случае -
FALSE . Переменная
NAME должна содержать
запакованный адрес, соответствующего для сокета типа. Тип адреса для разных
видов сокетов определяется в терминах языка
C структурой
sockaddr , которая представляет
собой абстрактный тип, содержащий все данные, необходимые для сокета.
binmode FILEHANDLE - Позволяет читать или писать файл с
соответствующим дескриптором в бинарном режиме.
bless REF, PACKAGE - Эта функция присоединяет объект на
который указывает ссылка REF , к
пакету PACKAGE , если он
определен, если же он опущен, то к текущему пакету. Для удобства возвращает
ссылку, так как bless() часто
является последним оператором в конструкторе.
caller EXPR - Возвращает контекст текущего вызова
подпрограммы. В скалярном контексте возвращает
TRUE , если мы находимся внутри
подпрограммы, eval() или
require() .
FALSE в противоположном случае. В
списковом контексте возвращает:
($package, $filename, $line) = caller;С аргументом EXPR возвращает более сложную
информацию, которая используется отладчиком для печати карты стека. Значение
EXPR отмечает глубину стека до
текущей записи.
($package, $filename, $line, $subroutine, $hasargs, $wantargs) = caller($i);chdir EXPR - Изменяет текущую директорию на указанную в EXPR , если это возможно. Если
EXPR опущено, то устанавливает в
качестве текущей директории домашнюю директорию. Возвращает
TRUE в случае успеха и
FALSE иначе.
chmod LIST - Изменяет права доступа к файлам указанным
в LIST . Первым аргументом должна
быть маска доступа в цифровом формате. Возвращает число файлов права доступа к
которым были успешно сменены.
$cnt = chmod 0700 'foo','bar'; chmod 700 @executables;chown LIST -Изменяет хозяина или группу, которой принадлежит список файлов. Первыми двумя аргументами должны быть uid и gid. Возвращает количество успешных изменений. chr NUMBER - Возвращает символ, представленный номером NUMBER в наборе символов.
Например, chr(65) вернет
A .
close FILEHANDLE - Закрывает файл с дескриптором
FILEHANDLE . Для более подробной
информации читайте manual page .
open(OUTPUT '/usr/home/petrov'); ... close OUTPUT;closedir DIRHANDLE - Закрывает каталог открытый вызовом opendir() .
connect SOCKET,NAME - Пытается соединиться с удаленным
сокетом (по аналогии с системным вызовом). Возвращает
TRUE в случае успешного
соединения и FALSE в
противоположном случае. Переменная
NAME должна содержать
запакованный адрес соответствующего данному сокету типа.
cos EXPR - Возвращает косинус
EXPR , выраженного в радианах.
Если EXPR опущено, возвращает
косинус $_ .
dbmopen ASSOC, DBNAME, MODE - Связывает
dbm(3) или
ndbm(3) файл с ассоциативным
массивом. ASSOC - имя
ассоциативного массива. DBNAME -
имя базы данных (без .dir или
.pag расширения). Если база
данных не существует, то она создается с правами доступа указанными в
MODE .
dbmopen(%HIST,'/usr/lib/news/history', 0600); while (($key, $val) = each %HIST){ print $key, '=', unpack('L',$val),\n;} dbmclose(%HIST);dbmclose ASSOC - Прерывает связь между файлом и ассоциативным массивом. defined EXPR - Возвращает TRUE или
FALSE , в зависимости от того
определено значение EXPR или нет.
Многие операции возвращают неопределенное значение в случае конца файла,
неинициализированной переменной, системной ошибки или при подобной ситуации.
Если речь идет о хэше, то defined покажет только определены ли ли величины,
ничего не говоря о существовании ключей. Для определения существования ключей
используется функция exists() .
delete EXPR - Стирает указанную величину. Возвращает
удаленную величину или значение не определено в случае, если удаление не
произошло.
foreach $key (keys %array) { delete $array{$key}; }Но более быстро то же самое можно сделать используя функцию undef() .
die LIST - Вне
eval() печатает значение
LIST в
STDERR и выходит из программы с
текущим значением $! . Если
значение $! есть ноль, то
принимает значение $? >> 8 .
Если значение $? >> 8 есть
ноль, то принимает значение 255. Внутри
eval() сообщение об ошибке
помещается в переменную $@ и
eval() прерывается с
неопределенным значением.
open(FL, "/root/rm-rf") || die "Can't open file.\n";do BLOCK - Функцией не является. Возвращает значение последней операции внутри блока. do EXPR - Использует величину EXPR как имя файла и далее
запускает содержимое этого файла, как программу на Perl. Обычно это используется
для включения библиотечных подпрограмм.
do 'stat.pl'; Это то же самое, что: eval 'cat stat.pl';Однако подключать библиотечные модули более удобно используя use и
require .
each ASSOC_ARRAY - Возвращает массив из двух элементов,
содержащий ключ и значение из хэша, причем по очереди перебирает все пары
($key, $value) .
while (($key,$value) = each %ENV){ print " $key = $value \n"; }eof FILEHANDLE - Возвращает 1, если следующее считывание возвращает конец файла или если FILEHANDLE не был открыт. При
опущении аргумента eof
обрабатывает последний файл, из которого происходило считывание. Но на практике
эта функция редко используется, так как в Perl-е операторы чтения возвращают
неопределенное значение в конце файла.
eval EXPR -
EXPR выполняется как маленькая программа в контексте
основной программы. Определенные переменные и подпрограммы остаются
определенными и в дальнейшем. Возвращается значение, которое возникает при
обработке последнего выражения. Если
EXPR опущено, то обрабатывается
$_ .
exec LIST - Исполняет внешнюю программу и НИКОГДА не
возвращает управление. На самом деле (в
UNIX ) производится системный
вызов семейства exec , который
подменяет программу, исполняющуюся в рамках текущего процесса. Если
LIST представляет собой список из
более, чем одного аргумента, то вызывается
execvp(3) с аргументами из
LIST . Если аргумент только один,
то он проверяется на метасимволы
shell . Если они присутствуют, то
он далее передается /bin/sh -c
для обработки. Если же их нет, то аргумент передается напрямую
execvp , который более эффективен.
exists EXPR - Возвращает
TRUE , если в хэше есть ключи и
даже в том случае, когда значения
VALUE не определены.
exit EXPR - Обрабатывает
EXPR и осуществляет немедленный
выход с полученной величиной.
$ans = <STDIN>; exit 0 if $ans =~ /^[Xx]/;Если EXPR опущено, то осуществляет
выход с нулевым статусом.
exp EXPR - Возвращает е (основание натурального
логарифма e = 2.718281828...) в степени
EXPR . По умолчанию обрабатывается
$_ .
fork - Делает системный вызов
fork(2) . Возвращает pid
(идентификатор процесса) дочернего процесса родительскому процессу и 0 дочернему
процессу. Значение не определено в случае неуспешного завершения команды.
Неуспех может произойти, например, в случае установки в системе ограничения на
количество процессов данного пользователя. Вот небольшой пример использования
этой функции.
unless ($pid = fork) { unless (fork) { exec "what you really wanna do"; die "no exec"; some_perl_code_here; exit 0; } exit 0; } waitpid($pid,0);getc FILEHANDLE - Возвращает следующий символ из файла чтения, присоединенный к FILEHANDLE или пустую строку в
случае конца файла. Если
FILEHANDLE опущен, то считывание
происходит из STDIN .
goto LABEL - Эта функция осуществляет переход на точку
программы LABEL и продолжает
выполнение программы с этой точки. Точка не может находиться внутри подпрограммы
или foreach цикла, так как в этих
случаях требуется предварительная инициализация. Использовать в качестве
LABEL выражение не рекомендуется,
хотя такая возможность и предоставляется.
grep BLOCK, LIST
grep EXPR, LIST - Обрабатывает
$_ = join( ':',$login,$passwd, $uid,$gid,$gcos,$home,$shell);keys ASSOC_ARRAY - Возвращает обычный массив, состоящий из ключей ассоциативного массива ASSOC_ARRAY . В скалярном
контексте возвращает число ключей.
@keys = keys %ENV;length EXPR - Возвращает длину EXPR в символах. По умолчанию
обрабатывает переменную $_ .
link OLDFILE,NEWFILE - Создает файл
NEWFILE , присоединенный к файлу
OLDFILE . (В
OS UNIX создание нескольких имен
для одного файла) Возвращает 1 в случае успеха и 0 иначе.
listen SOCKET, QUEUESIZE - Делает то же самое, что и
одноименный системный вызов. Возвращает
TRUE в случае успеха,
FALSE иначе.
local EXPR - На самом деле гораздо эффективнее
использовать функцию my . Функция
local делает перечисленные
переменные локальными в блоке, подпрограмме,
eval или
do . Если переменных более, чем
одна, то они должны объединяться скобками.
sub RANGEVAL{ local($min,$max,$thunk) = @_; local $result = ''; local $i; for ($i = $min; $i < $max; $i++) { $result = eval $thunk; } $result; }log EXPR - Возвращает натуральный логарифм EXPR , по умолчанию обрабатывает
переменную $_ .
map EXPR,LIST - Подставляет каждый элемент из списка
LIST в
EXPR (которое может быть блоком)
и возвращает список полученных после обработки величин.
@chars = map(chr, @nums);mkdir FILENAME,MODE - Создает директорию с именем FILENAME и правами доступа
указанными в переменной MODE . В
случае успеха возвращает 1, в противном случае возвращает 0 и устанавливает
значение переменной $!(errno) .
my EXPR - Эта функция (так же как и описанная ранее
функция local ) делает
перечисленные переменные локальными в пределах блока, подпрограммы, eval или do.
Если список состоит более чем из одного элемента, то он должен быть заключен в
скобки. Все элементы в списке должны быть фактическими параметрами. В отличие от
local, переменные локализованные функцией
my не видны снаружи блока,
подпрограммы или другой конструкции, внутри которой
my употребляется.
next LABEL - Употребляется подобно continue оператору в
C - запускает следующую итерацию
цикла.
line: while (<STDIN>) { next line if /^#/; ... }oct EXPR - Возвращает десятичное значение EXPR , интерпретируемого как
строка в восьмеричном формате. (Если строка начинается с
0x , то интерпретируется, как
строка в шестнадцатеричном формате.)
open FILEHANDLE,EXPR - Открывает файл, имя которого
описано в переменной EXPR и
привязывает его к FILEHANDLE .
Если EXPR опущено, то переменная
с таким же именем как FILEHANDLE
содержит имя файла. Если имя файла начинается со знака:
?Если знак | указывается после имени
команды, то вывод этой команды будет ассоциирован с дескриптором
FILEHANDLE , из которого будет
производиться чтение. Интересно, что нельзя открыть двойной программный канал,
то есть ассоциировать ввод и вывод команды с дескриптором файла (что
соответствовало бы системному вызову
popen в
UNIX ).
В случае, когда имя файла оканчивается вертикальной
чертой, оно расценивается как имя команды, вывод которой будет
интерпретироваться как ввод из файла (аналог функции
popen(3) ).
open(LOG, '>>/usr/spool/news/twitlog');open DIRHANDLE,EXPR - Открывает директорию с именем EXPR , возвращает
TRUE в случае успеха.
ord EXPR - Возвращает числовое значение в таблице ASCII
первого символа EXPR . По
умолчанию обрабатывает переменную
$_ .
print FILEHANDLE,LIST - Печатает строку или несколько
строк, разделенных запятой.
FILEHANDLE может быть именем
скалярной переменной, содержащей дескриптор файла. Если эта переменная опущена
то печать идет в выбранный канал вывода. Если переменная
LIST тоже опущена, то печатает
переменную $_ в
STDOUT .
printf FILEHANDLE, LIST - Эквивалентно
print FILEHANDLE, sprintf(LIST) .
Первый аргумент LIST
интерпретируется как формат печати.
rand EXPR - Возвращает выбранное случайным способом
значение между 0 и EXPR .
EXPR должно быть положительным.
По умолчанию производит выборку в диапазоне между 0 и 1. (Замечание: если ваша
функция постоянно возвращает слишком большие или слишком малые значения, то
скорее всего была допущена ошибка при компиляции вашей версии Perl. Было
установлено неверное значение
RANDBITS .)
read FILEHANDLE,SCALAR,LENGTH,OFFSET - Считывает
LENGTH байт данных из
FILEHANDLE в переменную
SCALAR . Возвращает число
считанных байт или неопределенное значение в случае ошибки. Если вы хотите
считать данные не с начала строки, то для этого нужно установить значение
переменной OFFSET .
readlink EXPR - Возвращает значение символьной ссылки,
если она существует. Если же ее нет, то выдает fatal error и устанавливает
значение переменной $! . По
умолчанию обрабатывает переменную
$_ .
redo LABEL - Перезапускает цикл без повторной обработки
условия. Блок continue, если он есть не исполняется. Если
LABEL опущена, то команда
выполняется для внутреннего цикла.
line: while(<STDIN>) { while ($_ ne '\') { if (ord $_ < 86) { ... } redo line; } print; }ref EXPR - Возвращает TRUE , если
EXPR является ссылкой и
FALSE в противоположном случае.
Полученное значение зависит от типа объекта на который указывает ссылка.
Существует несколько встроенных типов данных:
package ), то в таком
случае возвращается имя пакета.
if (ref($r) eq "HASH") { print " Это ссылка на ассоциативный массив.\n"; } if (!ref($r)) { print " А это не ссылка вовсе! \n";require - EXPR Используется для подключения модулей. require "oraperl.pm";reset EXPR - Обычно используется в continue блоке в конце цикла для
переустановки значений переменных.
EXPR интерпретируется как список
отдельных символов. Значения переменных и массивов, имена которых начинаются с
одного из этих символов списка переустанавливаются. Например:
?rm FILENAME - Удаляет файл или директорию с заданным именем. Возвращает 1 в случае успеха, 0 в противоположном случае и устанавливает значение переменной $! . По
умолчанию обрабатывает аргумент
$_ .
scalar EXPR - Выражение будет трактоваться в скалярном
контексте. Возвращает значение
EXPR .
seek FILEHANDLE, POSITION, WHENCE - Позволяет
установить курсор в файле, определенном в переменной
FILEHANDLE , на позицию
POSITION в режиме, указанном в
переменной WHENCE . Если
переменная WHENCE содержит
значение 0, то позиция отсчитывается от начала файла, если 1 то от текущей
позиции и если 2, то от конца файла. Возвращает 1 в случае успеха и 0 иначе.
select FILEHANDLE - Возвращает текущий выбранный
FILEHANDLE . Направляет вывод в
FILEHANDLE .
select RBITS,WBITS,EBITS,TIMEOUT - Вызывает системный
вызов select(2) с определенной
аргументами битовой маской.
shift ARRAY - Сдвигает массив
ARRAY влево с удалением первого
элемента и возвращает удаленный элемент. Если в массиве нет элементов, то
возвращает неопределенное значение. Если
ARRAY опущен, то обрабатывает
массив @ARGV в главной программе
и массив @_ в подпрограммах.
sin EXPR - Возвращает синус выражения
EXPR (выраженного в радианах).
Если аргумент опущен, то обрабатывается переменная
$_ .
sleep EXPR - Дает процессу команду остановки на
EXPR секунд. Если аргумент
опущен, то процесс зависает навсегда. В таком случае ``сон'' можно прервать,
послав ему сигнал. Возвращает число секунд, в течение которых процесс был в
состоянии остановки.
socket SOCKET,DOMAIN,TYPE,PROTOCOL - Создает сокет и
привязывает его к дескриптору файла
SOCKET . Остальные параметры
описываются так же, как и в одноименном системном вызове. В начале программы
необходимо написать use Socket; .
sort SUBROUTINE,LIST - Сортирует аргументы из
LIST и возвращает отсортированный
список. Если список является массивом, то несуществующие элементы массива не
учитываются и не возвращаются. Ниже приведено несколько примеров.
@articles = sort @files;- Лексическая сортировка без использования подпрограммы. @articles = sort{$a cmp $b} @files;- То же самое, но с использованием подпрограммы. @articles = sort{$a <=> $b} @files;- Численная сортировка по возрастанию. splice ARRAY,OFFSET,LENGTH,LIST - Удаляет из массива ARRAY элементы, отмеченные в
переменных OFFSET и
LENGTH и заменяет их элементами
списка LIST , если таковые
имеются. Возвращает удаленные из массива элементы. Длина массива растет или
уменьшается, если это необходимо. Если переменная
LENGTH опущена, то удаляет все,
начиная с OFFSET .
split /PATTERN/,EXPR,LIMIT - Разбивает строку на массив
строк и возвращает его. В скалярном контексте возвращает число полученных полей
и помещает полученный массив в
@_ . Если
EXPR опущено то разбивается
строка $_ . Если
PATTERN тоже опущен, то разбиение
происходит по символу пробел. Символы, указанные в
PATTERN , служат разделителями для
полей. Разделители могут быть длиннее, чем один символ. Если переменная
LIMIT задана и имеет
неотрицательное значение, то разбиение будет происходить на число полей не более
указанного в LIMIT . Если
переменная не определена, то пустые поля отбрасываются, если имеет отрицательное
значение, то это интерпретируется Perl-ом, как отсутствие ограничения на длину
возвращаемого массива. Если шаблону соответствует пустая строка, то
EXPR будет разбито на отдельные
символы. Например:
print join(':',split(/ */,'hi there'));напечатает строку h:i:t:h:e:r:e .
sqrt EXPR - Возвращает корень квадратный из значения
EXPR . По умолчанию обрабатывает
переменную $_ .
system LIST - Делает то же самое, что и функция exec
LIST , за одним исключением:
вместо того, чтобы просто начать выполнять программу , как это делает
exec, system делает
fork и порождает еще один
процесс, причем родительский процесс ждет завершения дочернего.
tell FULEHANDLE - Возвращает текущую позицию курсора в
файле FILEHANDLE . Если аргумент
опущен, то обрабатывает файл, который читался последним.
tie VARIABLE,PACKAGENAME,LIST - Привязывает переменную
к пакету, который будет заносить значения в эту переменную. Переменная
VARIABLE содержит имя переменной,
переменная PACKAGENAME содержит
имя пакета. Дополнительные аргументы передаются методу
new этого пакета. Обычно это
такие аргументы, которые в дальнейшем могут быть переданы в качестве параметров
dbm_open() функции из
C .
tie(%HIST, NDBM_File,'/usr/lib/news/history', 1, 0); while(($key,$val) = each %HIST) { print $key, '= ', unpack('L',$val),"\n"; } untie(%HIST);Пакет, реализующий ассоциативный массив, должен содержать следующие методы:
EXPR неопределенной величиной, в
случае, когда аргумент опущен ничего не меняет. Не следует пытаться применять
эту функцию к зарезервированным переменным, потому что результат может оказаться
непредсказуемым.
unlink LIST - Удаляет список файлов и возвращает число
удачно удаленных файлов. Если вы не являетесь суперпользователем, то эта функция
не может удалять каталоги. Даже в случае, когда программа запускается с
привилегиями суперпользователя, будьте осторожны, лучше использовать функцию
rmdir .
untie VARIABLE - Разрывает связь между переменной и
пакетом.
unshift ARRAY, LIST - Производит действие
противоположное действию функции
shift . Присоединяет
LIST к началу массива
ARRAY и возвращает новое
количество элементов в массиве.
use Module LIST - Осуществляет присоединение модуля к
программе.
use strict qw(subs,vars,refs);values ASSOC_ARRAY - Возвращает обычный массив, состоящий из значений ассоциативного массива ASSOC_ARRAY . В скалярном
контексте возвращает число элементов полученного массива. Элементы массива могут
располагаться в произвольном порядке.
wantarray - Возвращает
TRUE , если контекст исполняющейся
подпрограммы списковый, FALSE в
противоположном случае.
write - создает запись (возможно состоящую из
нескольких строк) в соответствующем файле, используя формат ассоциированный с
этим файлом. Формат для текущего канала вывода может быть установлен посредством
присваивания переменной $~{ }
имени формата.
|
На главную страницу > > В раздел программирование > > В раздел PERL |