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 имя_модуля;
Конец модуля это конец блока или файла. Головной модуль имеет по умолчанию имя main. На имя внутри модуля можно ссылаться добавляя ' ::' после имени модуля.
Например:
$main::var1– переменная в головном модуле.
::var1 – то же самое. Имя main можно опускать.
$модуль1::var1 – переменная в модуле 'модуль1'
$модуль1::модуль2::var1– Модуль2 содержится в модуле 1.
Читать дальше