Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Документация, учебники по Perl.doc
Скачиваний:
3
Добавлен:
29.10.2018
Размер:
2 Мб
Скачать
☆

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].