|
| ||||||||||||
| ||||||||||||
Приложение 2. Спецификация языка 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 Деструкторы
Когда удаляется последняя ссылка на объект, этот объект автоматически удаляется.
Это может произойти даже после завершения программы, если ссылки на объект
содержались в глобальных переменных. Если необходимо контролировать процесс
удаления объекта, можно определить в объекте специальный метод, называемый
деструктором. Деструктор объекта (в отличие от
|
|
CITForum © 1997–2025