|
Спецификация языка PerlАлена ФедосееваСодержаниеП2.1Основные особенности
Perl П2.2Cтруктуры данных
П2.3Синтаксис языка
Perl П2.4Языковые конструкции
Perl П2.5Объектная ориентация
П2.1 Основные особенности PerlП2.1.1 Введение Perl - интерпретируемый язык, приспособленный для обработки
произвольных текстовых файлов, извлечения из них необходимой информациии
и выдачи сообщений. Perl также удобен для написания различных системных
программ. Этот язык прост в использовании, эффективен, но про него трудно
сказать, что он элегантен и компактен. Perl сочитает в себе лучшие черты
C, shell, sed и awk, поэтому для тех,
кто знаком с ними, изучение Perl-а не представляет особого труда. Cинтаксис
выражений Perl-а близок к синтаксису C. В отличие от большинства
утилит ОС UNIX Perl не ставит ограничений на объем обрабатываемых
данных и если хватает ресурсов, то весь файл обрабатывается как одна строка.
Рекурсия может быть произвольной глубины. Хотя Perl приспособлен для сканирования
текстовых файлов, он может обрабатывать так же двоичные данные и создавать
.dbm файлы, подобные ассоциативным массивам. Perl позволяет использовать
регулярные выражения, создавать объекты, вставлять в программу на С
или C++ куски кода на Perl-е, а также позволяет осуществлять
доступ к базам данных, в том числе Oracle. #! /usr/local/bin/perl -w # запуск с ключом печати ошибок. use Oraperl; # подключение модуля для работы с Oracle $system_id = 'T:bdhost.somwere.com:Base'; # описание имени базы данных $lda = &ora_login($system_id, 'scott','tiger'); # подключение к базе данных пользователя # scott с паролем tiger $statement = 'create table MYTABLE (NAME char(10), TITLE char(20), ORGANIZATION varchar2(256))'; # SQL команда создания таблицы MYTABLE $csr = &ora_open($lda, $statement) || die $ora_errstr; # открытие курсора csr, если это невозможно, # то осуществляется выход и печать сообщения об ошибке. &ora_close($csr); # закрытие курсора open(FL, '/home/my_home_directory/my_file') || die "Can't open file \n"; # открытие файла, если это невозможно, # то выход с печатью сообщения об ошибке while ($string = <FL>) { # чтение входного потока из файла с дескриптором FL @array = split(/\//,$string); # считанная строка разбивается в массив # строк, разделителем служит слеш $st = 'insert into MYTABLE values(:1,:2,:3)'; # SQL команда помещения в таблицу некоторых значений $csr = &ora_open($lda,$st) || $ora_errstr; # открытие курсора или печать # сообщения об ошибке и выход &ora_bind($csr,$array[0],$array[1],$array[2]); # привязка значений переменных к величинам, которые # требуется поместить в таблицу &ora_close($csr); # закрытие курсора } close FL; # закрытие файла &ora_commit($lda); # завершение транзакции в базе данных &ora_logoff($lda); # отключение от базы данных П2.2 Cтруктуры данныхPerl поддерживает три типа данных:
Обычные массивы, как и в языке C, индексируются числами,
начиная с нуля. Ассоциативные массивы индексируются строками. Простые
скаляры (в дальнейшем мы будем также называть их переменными) всегда начинаются
со знака доллара: ¯Простой массив начинается со знака @ :
¯Ассоциативный массив (хэш) начинается со знака процент % :%day (key1, val1, key2, val2, ...) Каждый тип данных имеет свое именное пространство, поэтому вы можете использовать одно и то же имя одновременно для скалярной переменной, массива или хэша (а также для подпрограммы или метки) без опасения, что произойдет ошибка. Perl различает большие и маленькие буквы: FOO , foo
и Foo будут рассматриваться Perl-ом как разные переменные.
Имена, начинающиеся с буквы или знака подчеркивания, могут в дальнейшем
содержать в себе цифры или знаки подчеркивания. Имена, начинающиеся с цифры,
могут в дальнейшем содержать только цифры. Имена, начинающиеся не с буквы,
цифры или подчерка должны состоять только из одного символа. Большинство
таких имен зарезервировано, например $$ является идентификатором
текущего процесса. Интерпретация команды или величины часто зависит от требований
контекста. Существует два основных контекста: скалярный и списковый. Некоторые
операции возвращают список величин если в контексте подразумевается список
и одну величину, если контекст скалярный. Например, операция &ora_fetch
в скалярном контексте возвращает количество выбранных строк:$nfields = &ora_fetch($csr); В списковом контексте она возвращает массив выбранных строк: @array = &ora_fetch($csr); Левый аргумент определяет контекст правого аргумента. П2.2.1 Скалярные величины Скалярные переменные могут содержать различные простые
типы данных, такие как числа, строки или ссылки. Они не могут содержать
сложные типы, но могут содержать ссылку на массив или хэш. В булевском
контексте скаляр принимает значение ¯Строки заключаются в одинарные или двойные кавычки. Использование кавычек в Perl такое же как в bourne shell -е: строка в двойных кавычках
обрабатывается и вместо переменных подставляются их значения, а также обрабатываются
бакслэш-последовательности, строки в одинарных кавычках рассматривается
просто как последовательности символов. Используются также:
¯ П2.2.2 Простые массивы Perl позволяет произвольно удлинять массив путем обращения
к элементу, индекс которого больше, чем последний индекс массива. Так
же можно произвольно уменьшить длину массива. П2.2.3 Ассоциативные массивыАссоциативные массивы или хэши содержат пары ``ключ'' и ``значение''. Например: \%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);Часто для удобства чтения между ``ключом'' и ``значением'' ставят оператор =>. %map = ( 'red' => 0x00f, 'blue' => 0x0f0, 'green' => )xf00 ); П2.3 Синтаксис языка PerlП2.3.1 Основные понятия Программа на Perl-е состоит из последовательности команд.
В отличие от типизированных языков Perl не требует объявления типов своих
объектов. Все объекты, определенные в программе, до присваивания им какого-либо
значения по умолчанию принимают значение ``0''. Последовательность команд
исполняется сразу, в отличие от П2.3.2 Простые операторы Последовательность простых операторов может следовать
за отдельным модификатором. В Perl-е простыми модификаторами являются: do { $_ = <STDIN>; ... } until $_ eq ".\n";в котором проверка условия происходит после выполнения блока. Операторы цикла, которые будут описаны далее, не будут работать в этой конструкции, так как отсутствует метка цикла. П2.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"; }Блок семантически эквивалентен циклу, который исполняется один раз. Поэтому в него можно включать операторы контроля цикла, чтобы выйти из него или запустить его еще раз. П2.3.4 Операторы языка PerlП2.3.4.1 Термы и операторы списка Операторы в Perl-е имеют различный приоритет. Операторы,
заимствованные из П2.3.4.2 Оператор ``стрелка'' Также, как в П2.3.4.3 Операторы ++ и - - Эти операторы работают также как и в П2.3.4.4 Экспоненциальный оператор В Perl-е двойная звездочка П2.3.4.5 Символьные унарные операторы Унарный rand (10) * 20; - (rand10) * 20; rand +(10) * 20; - rand(10 * 20);Унарный бэкслэш ``'' обозначает ссылку на то, что стоит за ним. П2.3.4.6 Операторы связки Знак равенства с тильдой ``= П2.3.4.7 Бинарные операторы Звездочка П2.3.4.8 Операторы сдвигаДвоичный сдвиг осуществляется, как и во многих других языках программирования, с помощью операторов ``<<'' и ``>>''. При применении этих операторов значения левых аргументов сдвигаются в соответствующую сторону на количество разрядов, указанное в правых аргументах. Аргументы должны быть целочисленными. П2.3.4.9 Операторы сравнения ``<'' - возвращает TRUE если левый аргумент численно
меньше, чем правый. П2.3.4.10 Операторы эквивалентности П2.3.4.11 Побитовое И, побитовое ИЛИ и Исключающее ИЛИ Бинарное П2.3.4.12 Логическое И и логическое ИЛИ Бинарное $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); П2.3.4.13 Оператор диапазона for (1..10) { #code }В скалярном контексте он возвращает булевское значение. Если левый операнд TRUE , то .. принимает значение TRUE ,
если правый операнд тоже TRUE .
if (101..200) { print 'hi;)';}- напечатает вторую сотню строк П2.3.4.14 Условный оператор ($a_or_b ? $a : $b) = $c; П2.3.4.15 Операторы присваивания **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x= ($a += 2) *= 3; - то же самое, что и : $a = $a + 2;
$a = $a * 3;
П2.3.4.16 Оператор ``запятая'' П2.3.4.17 Логическое НЕ Унарное П2.3.4.18 Логическое И, ИЛИ и Исключающее ИЛИ П2.3.4.19 Оператор чтения из файлаВ Perl есть несколько операций ввода-вывода. Для вывода из файла используется команда <>. open(STDIN,"/etc/passwd"); while ($string = <STDIN>) { @a = split(/[:]/,$string); }Внутри этих скобок стоит дескриптор файла. Считывание происходит построчно. В конце файла <STDIN> принимает значение FALSE
и цикл while завершается. По умолчанию считывание происходит
в переменную $_ . Нулевой дескриптор файла используется также
как в sed и awk , то есть считывается поток из
файлов перечисленных в командной строке.
П2.3.4.20 Оператор замены строки Оператор
$path =~ s|/usr/local/bin|/usr/bin|; ($foo = $bar) =~ s/this/that/o; $count = ($paragraf =~ s/Mister\b/Mr./gm); П2.3.4.21 Оператор замены множества символов tr[A-Z][a-z] tr(+-*/)/ABCD/Этот оператор употребляется со следующими опциями:
$a = 'CCCCCCCCC'; $a =~ tr/C/D/s;теперь $a = 'D'
П2.4 Языковые конструкции PerlП2.4.1 СсылкиП2.4.1.1 Основные понятияВ предыдущих версиях Perl была реализована возможность только символьных ссылок. Perl версии 5 и выше позволяет использовать не только символьные ссылки на переменные, но и ``жесткие'' ссылки на любые данные. Так как любой скаляр может быть ссылкой, а массивы и хэши состоят из скаляров, то можно с легкостью организовать массив массивов, массив хэшей, хэш массивов и так далее. ``Жесткие'' ссылки следят за счетчиком ссылки и как только счетчик становится равным нулю, автоматически удаляют ссылку. Символьные ссылки содержат только имя переменной, также как символьная ссылка файловой системы содержит просто имя файла. Ссылки могут быть созданы несколькими способами:
ref() может быть использована для определения типа
объекта, на который указывает ссылка. Функция bless() может
быть использована для ассоциирования ссылки с пакетом, функционирующим как
объектный класс.
П2.4.1.2 Символьные ссылкиМы рассмотрели, что происходит, если величина, используемая в качестве ссылки, не была определена ранее. Что же происходит, если она уже определена и не является жесткой ссылкой? В таком случае она обрабатывается как символьная ссылка. То есть значение скаляра рассматривается как имя переменной, а не прямая ссылка на переменную. ¯ П2.4.2 Регулярные выражения 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 .
П2.4.3 Зарезервированные переменные В Perl есть имена имеющие специальное значение. Многие
из них аналогичны зарезервированным именам в $_ В эту переменную по умолчанию происходит ввод, присваивание, в нее складываются результаты поиска по заданному образцу. while(<>){...}или, что то же самое: while($_= <>) {...} $<digit> Эта переменная была описана
в предыдущем параграфе. Она доступна только для чтения, так же как и переменные
$. Эта переменная содержит номер строки, которая была почитана последней из файла, который был прочитан последним. Она также доступна только для чтения. $/ Содержит символ по которому разделяются
вводимые записи. По умолчанию содержит символ перевода строки. Она похожа
на переменную $| По умолчанию имеет значение 0. Если содержит ненулевое значение, то происходит сброс буферов каждый раз после осуществления вывода (на печать, на экран и т.д.). $, Содержит символ-разделитель полей для
оператора печати. Подобна переменной $ Содержит символ-разделитель записей
для оператора печати. Подобна переменной $" Подобна переменной $; Содержит символ-разделитель для эмуляции
многомерных хэшей. Если ссылаться на такой элемент хэша как $# Формат для печати чисел. Подобна переменной
$% Содержит номер текущей выводимой страницы. $= Содержит длину текущей страницы (количество печатных срок), обычно содержит значение 60. $- Содержит значение, определяющее количество оставшихся на странице строк, например количество еще не напечатанных строк для печатного канала вывода. $~ Содержит имя текущего формата сообщений. Обычно имя дескриптора файла. $^ Содержит имя текущего формата заголовка
страницы. Обычно содержит имя дескриптора файла с добавлением в конце
$: Содержит множество символов после которых вывод сроки может быть прерван и начат снова после перевода строки. $! Если эта переменная используется в числовом контексте, то содержит текущее значение errno (номер ошибки) со всеми обычными сообщениями. В строковом контексте содержит соответствующее системное сообщение об ошибке. $@ Содержит сообщение о синтаксической
ошибке, допущенной во время исполнения последней команды $$ Содержит идентификатор текущего процесса. $< Содержит идентификатор пользователя (UID), которому принадлежит текущий процесс. $> Содержит эффективный UID текущего процесса. $( Содержит идентификатор группы (GID) пользователя, которому принадлежит текущий процесс. $) Содержит эффективный GID текущего процесса. $0 Содержит имя файла, в котором находится исполняемая программа. $ARGV Содержит имя текущего файла, из которого происходит чтение. @ARGV Содержит массив аргументов командной строки, которые были переданы программе. @INC Содержит список точек входа в программу,
в которых используются конструкции %INC Содержит входы для каждого файла,
который включается посредством использования операторов %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'; П2.4.4 Встроенные функцииabs VALUE Возвращает абсолютное значение аргумента. accept NEWSOCKET, GENERICSOCKET подобно
системному вызову atan2 Y,X Возвращает bind SOCKET, NAME Привязывает сетевой
адрес к сокету, также как системный вызов binmode FILEHANDLE Позволяет читать или писать файл с соответствующим дескриптором в бинарном режиме. bless REF, PACKAGE Эта функция присоединяет
объект на который указывает ссылка caller EXPR Возвращает контекст текущего
вызова подпрограммы. В скалярном контексте возвращает ($package, $filename, $line) = caller;С аргументом EXPR возвращает более сложную информацию, которая
используется отладчиком для печати карты стека. Значение EXPR
отмечает глубину стека до текущей записи.
($package, $filename, $line, $subroutine, $hasargs, $wantargs) = caller($i); chdir EXPR Изменяет текущую директорию
на указанную в chmod LIST Изменяет права доступа к файлам
указанным в $cnt = chmod 0700 'foo','bar'; chmod 700 @executables; chown LIST Изменяет хозяина или группу, которой принадлежит список файлов. Первыми двумя аргументами должны быть uid и gid. Возвращает количество успешных изменений. chr NUMBER Возвращает символ, представленный
номером close FILEHANDLE Закрывает файл с дескриптором
open(OUTPUT '/usr/home/petrov'); ... close OUTPUT; closedir DIRHANDLE Закрывает каталог открытый
вызовом connect SOCKET,NAME Пытается соединиться
с удаленным сокетом (по аналогии с системным вызовом). Возвращает cos EXPR Возвращает косинус dbmopen ASSOC, DBNAME, 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 Возвращает delete EXPR Стирает указанную величину. Возвращает удаленную величину или значение не определено в случае, если удаление не произошло. foreach $key (keys %array) { delete $array{$key}; }Но более быстро то же самое можно сделать используя функцию undef() .
die LIST Вне open(FL, "/root/rm-rf") || die "Can't open file.\n"; do BLOCK Функцией не является. Возвращает значение последней операции внутри блока. do EXPR Использует величину do 'stat.pl';Это то же самое, что: eval 'cat stat.pl';Однако подключать библиотечные модули более удобно используя use
и require .
each ASSOC_ARRAY Возвращает массив из
двух элементов, содержащий ключ и значение из хэша, причем по очереди
перебирает все пары while (($key,$value) = each %ENV){ print " $key = $value \n"; } eof FILEHANDLE Возвращает 1, если следующее
считывание возвращает конец файла или если eval EXPR exec LIST Исполняет внешнюю программу
и НИКОГДА не возвращает управление. На самом деле (в exists EXPR Возвращает exit EXPR Обрабатывает $ans = <STDIN>; exit 0 if $ans =~ /^[Xx]/;Если EXPR опущено, то осуществляет выход с нулевым статусом.
exp EXPR Возвращает е (основание натурального
логарифма e = 2.718281828...) в степени fork Делает системный вызов 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 Возвращает следующий символ
из файла чтения, присоединенный к goto LABEL Эта функция осуществляет переход
на точку программы grep BLOCK, LIST grep EXPR, LIST Обрабатывает hex EXPR Возвращает десятичное значение
kill LIST Посылает сигнал списку процессов
int EXPR Возвращает целую часть join EXPR,LIST Соединяет в единую строку
строки из $_ = join( ':',$login,$passwd, $uid,$gid,$gcos,$home,$shell); keys ASSOC_ARRAY Возвращает обычный массив,
состоящий из ключей ассоциативного массива @keys = keys %ENV; length EXPR Возвращает длину link OLDFILE,NEWFILE Создает файл listen SOCKET, QUEUESIZE Делает то же
самое, что и одноименный системный вызов. Возвращает local EXPR На самом деле гораздо эффективнее
использовать функцию sub RANGEVAL{ local($min,$max,$thunk) = @_; local $result = ''; local $i; for ($i = $min; $i < $max; $i++) { $result = eval $thunk; } $result; } log EXPR Возвращает натуральный логарифм
map EXPR,LIST Подставляет каждый элемент
из списка @chars = map(chr, @nums); mkdir FILENAME,MODE Создает директорию
с именем my EXPR Эта функция (так же как и описанная
ранее функция next LABEL Употребляется подобно continue
оператору в line: while (<STDIN>) { next line if /^#/; ... } oct EXPR Возвращает десятичное значение
open FILEHANDLE,EXPR Открывает файл, имя
которого описано в переменной ¯ Если знак В случае, когда имя файла оканчивается вертикальной чертой,
оно расценивается как имя команды, вывод которой будет интерпретироваться
как ввод из файла (аналог функции open(LOG, '>>/usr/spool/news/twitlog'); open DIRHANDLE,EXPR Открывает директорию
с именем ord EXPR Возвращает числовое значение
в таблице ASCII первого символа print FILEHANDLE,LIST Печатает строку
или несколько строк, разделенных запятой. printf FILEHANDLE, LIST Эквивалентно rand EXPR Возвращает выбранное случайным
способом значение между 0 и read FILEHANDLE,SCALAR,LENGTH,OFFSET Считывает
readlink EXPR Возвращает значение символьной
ссылки, если она существует. Если же ее нет, то выдает fatal error и устанавливает
значение переменной redo LABEL Перезапускает цикл без повторной
обработки условия. Блок continue, если он есть не исполняется. Если line: while(<STDIN>) { while ($_ ne '\') { if (ord $_ < 86) { ... } redo line; } print; } ref EXPR Возвращает
package ),
то в таком случае возвращается имя пакета.
if (ref($r) eq "HASH") { print " Это ссылка на ассоциативный массив.\n"; } if (!ref($r)) { print " А это не ссылка вовсе! \n"; require EXPR Используется для подключения модулей. require "oraperl.pm"; reset EXPR Обычно используется в ¯ rm FILENAME Удаляет файл или директорию
с заданным именем. Возвращает 1 в случае успеха, 0 в противоположном случае
и устанавливает значение переменной scalar EXPR Выражение будет трактоваться
в скалярном контексте. Возвращает значение seek FILEHANDLE, POSITION, WHENCE Позволяет
установить курсор в файле, определенном в переменной select FILEHANDLE Возвращает текущий выбранный
select RBITS,WBITS,EBITS,TIMEOUT Вызывает
системный вызов shift ARRAY Сдвигает массив sin EXPR Возвращает синус выражения sleep EXPR Дает процессу команду остановки
на socket SOCKET,DOMAIN,TYPE,PROTOCOL Создает
сокет и привязывает его к дескриптору файла sort SUBROUTINE,LIST Сортирует аргументы
из @articles = sort @files;- Лексическая сортировка без использования подпрограммы. @articles = sort{$a cmp $b} @files;- То же самое, но с использованием подпрограммы. @articles = sort{$a <=> $b} @files;- Численная сортировка по возрастанию. splice ARRAY,OFFSET,LENGTH,LIST Удаляет
из массива split /PATTERN/,EXPR,LIMIT Разбивает строку
на массив строк и возвращает его. В скалярном контексте возвращает число
полученных полей и помещает полученный массив в print join(':',split(/ */,'hi there'));напечатает строку h:i:t:h:e:r:e .
sqrt EXPR Возвращает корень квадратный
из значения system LIST Делает то же самое, что и
функция exec tell FULEHANDLE Возвращает текущую позицию
курсора в файле tie VARIABLE,PACKAGENAME,LIST Привязывает
переменную к пакету, который будет заносить значения в эту переменную.
Переменная tie(%HIST, NDBM_File,'/usr/lib/news/history', 1, 0); while(($key,$val) = each %HIST) { print $key, '= ', unpack('L',$val),"\n"; } untie(%HIST);Пакет, реализующий ассоциативный массив, должен содержать следующие методы: TIEHASH objectname, LIST DESTROY this FETCH this, key STORE this, key, value DELETE this, key EXISTS this, key FIRSTKEY this NEXTKEY this, lastkey Пакет, реализующий обычный массив, должен содержать следующие методы: TIEARRAY objectname, LIST DESTROY this FETCH this, key STORE this, key, value Пакет, реализующий скаляры, должен содержать следующие методы : TIESCALAR objectname, LIST DESTROY this FETCH this STORE this, value truncate FILEHANDLE, LENGTH Обрезает файл FILEHANDLE до заданной длины. undef EXPR Делает значение unlink LIST Удаляет список файлов и возвращает
число удачно удаленных файлов. Если вы не являетесь суперпользователем,
то эта функция не может удалять каталоги. Даже в случае, когда программа
запускается с привилегиями суперпользователя, будьте осторожны, лучше
использовать функцию untie VARIABLE Разрывает связь между переменной и пакетом. unshift ARRAY, LIST Производит действие
противоположное действию функции use Module LIST Осуществляет присоединение модуля к программе. use strict qw(subs,vars,refs); values ASSOC_ARRAY Возвращает обычный
массив, состоящий из значений ассоциативного массива wantarray Возвращает write создает запись (возможно состоящую
из нескольких строк) в соответствующем файле, используя формат ассоциированный
с этим файлом. Формат для текущего канала вывода может быть установлен
посредством присваивания переменной П2.4.5 Подпрограммы и модулиП2.4.5.1 ПодпрограммыОписать и использовать подпрограмму можно несколькими способами:
@_ ,
его элементы являются ссылками на реальные скалярные параметры. Подпрограмма
возвращает значение, полученное в результате исполнения последнего оператора
подпрограммы. Как уже говорилось, подпрограмма вызывается использованием
префикса & перед ее именем, в Perl 5 этот префикс не обязателен.
Пример:
sub MAX { my $max = pop(@_); foreach $foo (@_) { $max = $foo if $max < $foo; } $max; } ... $bestmark = &MAX(1,2,3,4,5);Подпрограмма может вызываться рекурсивно. Если подпрограмма вызывается с использованием & формы, то список аргументов необязателен.
Если вы хотите создать внутри модуля его собственную, невидимую снаружи
подпрограмму, то описание должно быть анонимным:
my $subref = sub {...} &$subref(1,2,3); П2.4.5.2 Пакеты Perl поддерживает механизм альтернативного именного пространства
для каждого отдельного пакета. Обычная программа является пакетом с именем
package mypack; sub main::mysub { ... } П2.4.5.3 Таблицы символов Таблицы символов пакета хранятся в ассоциативном массиве
с тем же именем и двойным двоеточием в конце. Для пакетов включенных в
пакет имя символьной таблицы составляется аналогичным образом: П2.4.5.4 Конструкторы и деструкторы пакетов Существует две функции специального вида - конструкторы
и деструкторы. Это П2.4.5.5 Классы В Perl 5 нет специального синтаксиса для описания классов,
но пакеты могут функционировать как классы, если они содержат подпрограммы
функционирующие как методы. Такие пакеты могут также брать некоторые методы
из других пакетов-классов. Для этого необходимо перечислить имена других
пакетов в массиве П2.4.5.6 МодулиВ Perl 5 понятие пакетов расширено в понятие модулей. Модули это пакеты находящиеся в одноименном файле, включенном в библиотеку. Модули подключаются следующим образом: use Module; или use Module LIST;Это эквивалентно: BEGIN { require "Module.pm"; import Module; }Все модули имеют расширение .pm . Если именное пространство
модуля пересекается с именным пространством основной программы то всегда
используется use , если не пересекается то можно использовать
require . Стандартные модули Perl описаны в документации. П2.5 Объектная ориентацияПонятие объектной ориентации зиждется на трех простых определениях:
П2.5.1 ОбъектыВ отличие от C++, Perl не имеет специального синтаксиса для описания конструкторов. Конструктор, как уже говорилось раньше, это просто подпрограмма, которая возвращает ссылку ассоциированную с классом (как правило с тем, где определена подпрограмма). Например, типичный конструктор: package Critter; sub new { bless {} } {} создает ссылку на анонимный хэш.В пределах класса методы как правило работают с обычными ссылками. Конструктор может привязать объект к другому классу, в таком случае предыдущая привязка бывает забыта, так как объект не может принадлежать одновременно нескольким классам. П2.5.2 Классы В отличие от П2.5.3 Методы В Perl-е метод имеет синтаксис простой подпрограммы. В
качестве первого аргумента метода выступает объект или пакет. Существует
два типа методов: статические и виртуальные методы. sub find { my ($class, $name) = @_; $objtable{$name}; }Виртуальные методы имеют первым аргументом ссылку на объект. Обычно они помещают эту ссылку в переменную self или this
и в дальнейшем используют ее как обычную ссылку.
sub display { my $self = shift; my @keys = @_ ? @_ : sort keys %$self; foreach $key (@keys) { print "\t$key => $self ->{$key}\n"; } } П2.5.4 Вызов методаСуществует два способа обратиться к методу. Во-первых, можно вызвать его просто как подпрограмму. Но в таком случае не работает механизм наследования. Второй способ лучше просто проиллюстрировать примерами. $fred = find Critter "Fred"; display $fred, 'Height', 'Weight';Это можно записать так: display {find Critter "Fred"} 'Height', 'Weight'; П2.5.5 Деструкторы Когда удаляется последняя ссылка на объект, этот объект
автоматически удаляется. Это может произойти даже после завершения программы,
если ссылки на объект содержались в глобальных переменных. Если необходимо
контролировать процесс удаления объекта, можно определить в объекте специальный
метод, называемый деструктором. Деструктор объекта (в отличие от
|
http://athena.vvsu.ru |