|
ние функции 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) *
В Пел реализован механизм модулей. Модуль это группа
подпрограмм и переменных обычно включенных в один файл. Внутри
одного модуля можно определить другой модуль. Начало модуля
определяется директивой:
packages имя_модуля;
Конец модуля это конец блока или файла. Головной модуль
имеет по
|
|