П2.4.5.2 Пакеты
П2.4.5.2 Пакеты
Perl поддерживает механизм альтернативного именного пространства для каждого отдельного пакета. Обычная программа является пакетом с именем main. Можно ссылаться на переменные или дескрипторы файлов из других пакетов посредством использования префикса перед именем переменной, состоящего из имени пакета и двойного двоеточия: $Package::Variable. Если имя пакета нулевое, то предполагается использование переменной из main пакета. То есть $::sail эквивалентно $main::sail. Пакеты могут включать в себя другие пакеты, в таком случае чтобы обратиться к переменной нужно применить описанное обозначение рекурсивно: $OUTER::INNER::var.
В пакете могут содержаться только переменные, чьи имена начинаются с буквы или подчерка, остальные переменные содержатся в пакете main. Кроме того зарезервированные переменные, как то STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC и SIG также содержатся в главном пакете. package mypack; sub main::mysub { ... }
П2.4.5.3 Таблицы символов
П2.4.5.3 Таблицы символов
Таблицы символов пакета хранятся в ассоциативном массиве с тем же именем и двойным двоеточием в конце. Для пакетов включенных в пакет имя символьной таблицы составляется аналогичным образом: %OUTER::INNER::.
П2.4.5.4 Конструкторы и деструкторы пакетов
П2.4.5.4 Конструкторы и деструкторы пакетов
Существует две функции специального вида - конструкторы и деструкторы. Это BEGIN и END программы в их описании необязательно использование sub. Подпрограмма BEGIN исполняется сразу, как только это возможно, то есть в момент, когда она полностью определена, даже перед тем как обрабатывается остаток содержащего файла. В файле может быть несколько блоков BEGIN. Они исполняются в порядке определения.
Подпрограмма END исполняется в самом конце. В файле может содержаться несколько END блоков, они исполняются в обратном порядке.
П2.4.5.5 Классы
П2.4.5.5 Классы
В Perl 5 нет специального синтаксиса для описания классов, но пакеты могут функционировать как классы, если они содержат подпрограммы функционирующие как методы. Такие пакеты могут также брать некоторые методы из других пакетов-классов. Для этого необходимо перечислить имена других пакетов в массиве @ISA.
П2.4.5.6 Модули
П2.4.5.6 Модули
В Perl 5 понятие пакетов расширено в понятие модулей. Модули это пакеты находящиеся в одноименном файле, включенном в библиотеку. Модули подключаются следующим образом: use Module; или use Module LIST;
Это эквивалентно: BEGIN { require "Module.pm"; import Module; }
Все модули имеют расширение .pm. Если именное пространство модуля пересекается с именным пространством основной программы то всегда используется use, если не пересекается то можно использовать require.
Стандартные модули Perl описаны в документации.
П2.5.1 Объекты
П2.5.1 Объекты
В отличие от C++, Perl не имеет специального синтаксиса для описания конструкторов. Конструктор, как уже говорилось раньше, это просто подпрограмма, которая возвращает ссылку ассоциированную с классом (как правило с тем, где определена подпрограмма). Например, типичный конструктор: package Critter; sub new { bless {} }
{} создает ссылку на анонимный хэш.
В пределах класса методы как правило работают с обычными ссылками. Конструктор может привязать объект к другому классу, в таком случае предыдущая привязка бывает забыта, так как объект не может принадлежать одновременно нескольким классам.
П2.5.2 Классы
П2.5.2 Классы
В отличие от C++, Perl не имеет специального синтаксиса для описания классов. Классом является пакет, чьи подпрограммы выступают в качестве методов. Для каждого пакета определен специальный массив @ISA, в котором перечислены пакеты, подключенные к данному пакету. Таким образом в Perl реализован механизм наследования методов. Метод, принадлежащий другому объекту, подключается как подпрограмма.
П2.5.3 Методы
П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 Вызов метода
П2.5.4 Вызов метода
Существует два способа обратиться к методу. Во-первых, можно вызвать его просто как подпрограмму. Но в таком случае не работает механизм наследования. Второй способ лучше просто проиллюстрировать примерами. $fred = find Critter "Fred"; display $fred, 'Height', 'Weight';
Это можно записать так: display {find Critter "Fred"} 'Height', 'Weight';
П2.5.5 Деструкторы
П2.5.5 Деструкторы
Когда удаляется последняя ссылка на объект, этот объект автоматически удаляется. Это может произойти даже после завершения программы, если ссылки на объект содержались в глобальных переменных. Если необходимо контролировать процесс удаления объекта, можно определить в объекте специальный метод, называемый деструктором. Деструктор объекта (в отличие от C++) имеет фиксированное имя DESTROY и вызывается перед удалением объекта. В нем можно реализовать дополнительные процедуры, необходимые для корректного завершения (например, удаление временных файлов, используемых объектом).
[an error occurred while processing this directive]
П2.5 Объектная ориентация
П2.5 Объектная ориентация
Понятие объектной ориентации зиждется на трех простых определениях:
Объект это просто ссылка. Класс это просто пакет, который содержит методы для работы с объектными ссылками. Метод это просто подпрограмма, которая имеет своим первым аргументом объектную ссылку (или имя пакета для статического метода).
Print FILEHANDLE,LIST
print FILEHANDLE,LIST
Печатает строку или несколько строк, разделенных запятой. FILEHANDLE может быть именем скалярной переменной, содержащей дескриптор файла. Если эта переменная опущена то печать идет в выбранный канал вывода. Если переменная LIST тоже опущена, то печатает переменную $_ в STDOUT.
Printf FILEHANDLE, LIST
printf FILEHANDLE, LIST
Эквивалентно print FILEHANDLE, sprintf(LIST). Первый аргумент LIST интерпретируется как формат печати.
Rand EXPR
rand EXPR
Возвращает выбранное случайным способом значение между 0 и EXPR. EXPR должно быть положительным. По умолчанию производит выборку в диапазоне между 0 и 1. (Замечание: если ваша функция постоянно возвращает слишком большие или слишком малые значения, то скорее всего была допущена ошибка при компиляции вашей версии Perl. Было установлено неверное значение RANDBITS.)
Read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH,OFFSET
Считывает LENGTH байт данных из FILEHANDLE в переменную SCALAR. Возвращает число считанных байт или неопределенное значение в случае ошибки. Если вы хотите считать данные не с начала строки, то для этого нужно установить значение переменной OFFSET.
Readlink EXPR
readlink EXPR
Возвращает значение символьной ссылки, если она существует. Если же ее нет, то выдает fatal error и устанавливает значение переменной $!. По умолчанию обрабатывает переменную $_.
Redo LABEL
redo LABEL
Перезапускает цикл без повторной обработки условия. Блок continue, если он есть не исполняется. Если LABEL опущена, то команда выполняется для внутреннего цикла. line: while(<STDIN>) { while ($_ ne '\') { if (ord $_ < 86) { ... } redo line; } print; }
Ref EXPR
ref EXPR
Возвращает TRUE, если EXPR является ссылкой и FALSE в противоположном случае. Полученное значение зависит от типа объекта на который указывает ссылка. Существует несколько встроенных типов данных:
REF SCALAR ARRAY HASH CODE GLOB
Если объект, на который указывает ссылка, находится в пакете (package), то в таком случае возвращается имя пакета. if (ref($r) eq "HASH") { print " Это ссылка на ассоциативный массив.\n"; } if (!ref($r)) { print " А это не ссылка вовсе! \n";
Require EXPR
require EXPR
Используется для подключения модулей. require "oraperl.pm";
Reset EXPR
reset EXPR
Обычно используется в continue блоке в конце цикла для переустановки значений переменных. EXPR интерпретируется как список отдельных символов. Значения переменных и массивов, имена которых начинаются с одного из этих символов списка переустанавливаются. Например: ¯ reset 'X' переустановит все X переменные reset 'a-z' переустановит все переменные, имена которых состоят из маленьких букв.
Rm FILENAME
rm FILENAME
Удаляет файл или директорию с заданным именем. Возвращает 1 в случае успеха, 0 в противоположном случае и устанавливает значение переменной $!. По умолчанию обрабатывает аргумент $_.
Scalar EXPR
scalar EXPR
Выражение будет трактоваться в скалярном контексте. Возвращает значение EXPR.
Seek FILEHANDLE, POSITION, WHENCE
seek FILEHANDLE, POSITION, WHENCE
Позволяет установить курсор в файле, определенном в переменной FILEHANDLE, на позицию POSITION в режиме, указанном в переменной WHENCE. Если переменная WHENCE содержит значение 0, то позиция отсчитывается от начала файла, если 1 то от текущей позиции и если 2, то от конца файла. Возвращает 1 в случае успеха и 0 иначе.
Select FILEHANDLE
select FILEHANDLE
Возвращает текущий выбранный FILEHANDLE. Направляет вывод в FILEHANDLE.
Select RBITS,WBITS,EBITS,TIMEOUT
select RBITS,WBITS,EBITS,TIMEOUT
Вызывает системный вызов select(2) с определенной аргументами битовой маской.
Shift ARRAY
shift ARRAY
Сдвигает массив ARRAY влево с удалением первого элемента и возвращает удаленный элемент. Если в массиве нет элементов, то возвращает неопределенное значение. Если ARRAY опущен, то обрабатывает массив @ARGV в главной программе и массив @_ в подпрограммах.
%SIG
%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';
Sin EXPR
sin EXPR
Возвращает синус выражения EXPR (выраженного в радианах). Если аргумент опущен, то обрабатывается переменная $_.
Sleep EXPR
sleep EXPR
Дает процессу команду остановки на EXPR секунд. Если аргумент опущен, то процесс зависает навсегда. В таком случае ``сон'' можно прервать, послав ему сигнал. Возвращает число секунд, в течение которых процесс был в состоянии остановки.
Socket SOCKET,DOMAIN,TYPE,PROTOCOL
socket SOCKET,DOMAIN,TYPE,PROTOCOL
Создает сокет и привязывает его к дескриптору файла SOCKET. Остальные параметры описываются так же, как и в одноименном системном вызове. В начале программы необходимо написать use Socket;.
Sort SUBROUTINE,LIST
sort SUBROUTINE,LIST
Сортирует аргументы из LIST и возвращает отсортированный список. Если список является массивом, то несуществующие элементы массива не учитываются и не возвращаются. Ниже приведено несколько примеров. @articles = sort @files;
- Лексическая сортировка без использования подпрограммы. @articles = sort{$a cmp $b} @files;
- То же самое, но с использованием подпрограммы. @articles = sort{$a <=> $b} @files;
- Численная сортировка по возрастанию.
Спецификация языка Perl
Спецификация языка Perl
Алена Федосеева
Splice ARRAY,OFFSET,LENGTH,LIST
splice ARRAY,OFFSET,LENGTH,LIST
Удаляет из массива ARRAY элементы, отмеченные в переменных OFFSET и LENGTH и заменяет их элементами списка LIST, если таковые имеются. Возвращает удаленные из массива элементы. Длина массива растет или уменьшается, если это необходимо. Если переменная LENGTH опущена, то удаляет все, начиная с OFFSET.
Split /PATTERN/,EXPR,LIMIT
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
sqrt EXPR
Возвращает корень квадратный из значения EXPR. По умолчанию обрабатывает переменную $_.
System LIST
system LIST
Делает то же самое, что и функция exec LIST, за одним исключением: вместо того, чтобы просто начать выполнять программу , как это делает exec, system делает fork и порождает еще один процесс, причем родительский процесс ждет завершения дочернего.
Tell FULEHANDLE
tell FULEHANDLE
Возвращает текущую позицию курсора в файле FILEHANDLE. Если аргумент опущен, то обрабатывает файл, который читался последним.
Tie VARIABLE,PACKAGENAME,LIST
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);
Пакет, реализующий ассоциативный массив, должен содержать следующие методы:
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
truncate FILEHANDLE, LENGTH
Обрезает файл FILEHANDLE до заданной длины.
Undef EXPR
undef EXPR
Делает значение EXPR неопределенной величиной, в случае, когда аргумент опущен ничего не меняет. Не следует пытаться применять эту функцию к зарезервированным переменным, потому что результат может оказаться непредсказуемым.
Unlink LIST
unlink LIST
Удаляет список файлов и возвращает число удачно удаленных файлов. Если вы не являетесь суперпользователем, то эта функция не может удалять каталоги. Даже в случае, когда программа запускается с привилегиями суперпользователя, будьте осторожны, лучше использовать функцию rmdir.
Unshift ARRAY, LIST
unshift ARRAY, LIST
Производит действие противоположное действию функции shift. Присоединяет LIST к началу массива ARRAY и возвращает новое количество элементов в массиве.
Untie VARIABLE
untie VARIABLE
Разрывает связь между переменной и пакетом.
Use Module LIST
use Module LIST
Осуществляет присоединение модуля к программе. use strict qw(subs,vars,refs);
Values ASSOC_ARRAY
values ASSOC_ARRAY
Возвращает обычный массив, состоящий из значений ассоциативного массива ASSOC_ARRAY. В скалярном контексте возвращает число элементов полученного массива. Элементы массива могут располагаться в произвольном порядке.
Wantarray
wantarray
Возвращает TRUE, если контекст исполняющейся подпрограммы списковый, FALSE в противоположном случае.
Write
write
создает запись (возможно состоящую из нескольких строк) в соответствующем файле, используя формат ассоциированный с этим файлом. Формат для текущего канала вывода может быть установлен посредством присваивания переменной $~{ } имени формата.