Выбери любимый жанр

Введение в Perl - Маслов Владимир Викторович - Страница 17


Перейти на страницу:
Изменить размер шрифта:

17

Возвращает значени строки как вектор без знаковых целых.

wait

Ожидать окончание порожденного процесса. Возвращает PID для родительского процесса или -1 если нет процесса потомка.

Код завершения записывается в переменную $?.

waitpid PID, FLAGS

Ожидать окончания процесса потомка с указанным PID.

Возвращает либо PID этого процесса либо -1 если нет такого процесса. Код завершения записывается в перменную $?.

wantarray

Возвращает true если подпрограмма вызывается в списковом контексте и false – в скалярном.

warn список

Выодит в стандартный поток ошибок STDERR сообщение аналогично die(), но не прекращает работу программы.

write файл

write выражение

write

Выводит в файл форматированные данные по оператору format. По умолчанию имя формата совпадает с именем указателя файла. Имя файла-по умолчанию можно изменить функцией select(), а имя формата при этом надо присвоить переменной $~. Заголовок листа пишется автоматически. Если на листе не хватает места для вывода то выводится «перевод формата» и специальная форма заголовка листа затем сами записи. По умолчанию имя формата заголовка листа состоит из имени указателя файла и добавленной строки «_TOP». Динамически это млжно делать присваивая формат переменной $^. Количество оставшихся строк листа содержится в переменной $– и если присвоить ей 0 то произойдет смена листа. Подробно описание форматов смотри в главе «Форматы».

y///

Оператор транслятор. Смотри главу «Операторы».

Подпрограммы

Для применения подпрограммы ее необходимо определить либо в текщем модуле (файле) либо во внешнем модуле (файле).

Подпрограммы определяются и декларируются следующим образом:

subимя; # Только декларация. Определение ниже.

sub имя (прототипы); То же но с декларацией параметров.

sub имя блок; # Декларация и определение.

sub имя (прототипы) блок; # То же, но с парамметрами.

Для определения динамичской анонимной подпрограммы можно указать:

$переменная = sub блок;

Для импортирования подпрограмм из других модулей используйте:

use модуль qw(подпрограмма1 подпрограмма2 );

Вызов подпрограммы:

имя(список параметров); # символ '&' можно не указывать.

имя список; # Если подпрогрмма уже декларирована.

&имя; # Параметры в @_

Все параметры передаются подпрограмме как массив @_.

Соответсвенно $_[0] – первый параметр, $_[1] – второй и т.д.

Массив @_ – локальный, но он содержит адреса параметров поэтому можно изменять значение параметров.

Возвращаемое значение подпрограммы – результат последнего оператора.

Это может быть как скаляр так и массив. Можно принудительно возвращать результат используя функцию return().

Подпрограмму можно вызвать используя префикс '&' перед именем подпрограммы. Если подпрограмма предварительно продекларирована то префикс и скобки можно опустить.

Private переменные.

Для применения переменных доступных только внутри блока или подпрограммы необходимо определить их с помощью функции my(список).

Если переменная одна то скобки можно опустить.

my() декларирует private переменные в пределах текущей подпрограммы, блока, функции eval() или do/require/use файлов. Private переменные аналогичны auto переменным в С.

Пример:

# Программа вычисления факториала.

print fact(3); # вычислить факториал 3*2*1

sub fact # Определяем подпрограмму.

{ my $m; # private переменная но не local !

$m = $_[0];

return 1 if $m <= 1;

return($m * fact($m -1));

}

Можно указывать начальные значения private переменных как:

my(список) = выражение;

Так для вышеприведенного примера лучше было написать:

my($m) = $_[0];

Переменные типа local.

В общем лучше использовать private переменные так-как это надежней и быстрее. private переменные обеспечивают лексическую область применения (видимости) а local – динамическую. Обычно это переменные форматов значение которых должно быть видимо из вызываемых подпрограмм.

Применение функции local() не целесообразно в циклах так как она вызывается каждый раз и таким образом заметно замедляет время выполнения цикла.

Прототипы (prototypes).

Для краткого описаня типа параметров передаваемых подпрограмме можно применять прототипы. В Перл существуют следующие прототипы:

Декларация Пример вызова

sub mylink($$) mylink $old, $new

sub myvec($$$) myvec $var, $offset, 1

sub myindex($$;$) myindex &getstring, «substr»

sub myreverse(@) myreverse $a, $b, $c

sub myjoin($@) myjoin ":",$a,$b,$c

sub mypop(\@) mypop @array

sub mysplice(\@$$@) mysplice @array, @array, 0, @pushme

sub mykeys(\%) mykeys %{$hashref}

sub myopen(*;$) myopen HANDLE, $name

sub mypipe(**) mypipe READHANDLE, WRITEHANDLE

sub mygrep(&@) mygrep { /foo/ } $a, $b, $c

sub myrand($) myrand 42

sub mytime() mytime

Здесь:

\'символ' – параметр с типом 'символ'

'@' или '%' – все оставшиеся параметры как список

'$' – скаляр

'&' – безимянная подпрограмма

'*' – ссылка на таблицу имен

';' – разграничитель обязательных и не обязательных параметтров.

Ссылка как параметр.

Иногда нужно в качестве параметра передать подпрограмме не значение элемента массива а ссылку на него, что бы подпрограмма могла изменить значение элемента. Для этого в Перл к имени переменной добавляется символ '*' Подбное выражение называют 'type glob' так как в Юниксе символом '*' обозначают «все возможные значения». Поэтому '*' для массива означает «все элементы массива».

Для скаляров употряблять '*' не имеет смысла т.к. они и так передаются ссылкой и вы можете изменять значение параметра изменяя например переменную $_[0].

Переопределение встроенных функций.

Большинство встроенных функций Перл можно переопределить своими собственными. Обычно это делают для удобства совместимости Перл для разных платформ систем.

Для этого нужно перечислить имена этих функций в виде:

use subs 'функция1', 'функция2' ....;

и далее в модуле определить сами функции.

Автозагрузка.

Если вы попытаетесь вызвать не существующую функцию то Перл выдаст немедленно сообщение об ошибке. Но если вы определите подпрограмму с именем 'AUTOLOAD' то она будет вызвана с теми же параметрами а переменная $AUTOLOAD будет содержать имя не существующей подпрограммы. Данный механизм очень удобен для средств отладки.

Модули (packages)

В Перл реализован механизм модулей. Модуль это группа подпрограмм и переменных обычно включенных в один файл. Внутри одного модуля можно определить другой модуль. Начало модуля определяется директивой:

17
Мир литературы

Жанры

Фантастика и фэнтези

Детективы и триллеры

Проза

Любовные романы

Приключения

Детские

Поэзия и драматургия

Старинная литература

Научно-образовательная

Компьютеры и интернет

Справочная литература

Документальная литература

Религия и духовность

Юмор

Дом и семья

Деловая литература

Жанр не определен

Техника

Прочее

Драматургия

Фольклор

Военное дело