Спецификация языка Perl

         

П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

создает запись (возможно состоящую из нескольких строк) в соответствующем файле, используя формат ассоциированный с этим файлом. Формат для текущего канала вывода может быть установлен посредством присваивания переменной $~{ } имени формата.