Можно принудительно возвращать результат используя функцию
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 Здесь: \'символ' – параметр с типом 'символ' '@'или
'%'– все оставшиеся параметры как список '$' – скаляр '&' – безимянная подпрограмма '*' – ссылка на таблицу имен ';' – разграничитель обязательных и не обязательных параметтров.
Ссылка как параметр. Иногда нужно в качестве параметра передать подпрограмме не значение элемента массива а ссылку на него, что бы подпрограмма могла изменить значение элемента.
|