Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [ 41 ] 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

foreach $ (@ ) {

$sum += $ ; # прибавить все элементы

return $sum # последнее вычисленное выражение; сумма всех элементов

Когда выполняется первый оператор в теле подпрограммы, текущее значение глобальной переменной $sum сохраняется и создается соверщенно новая переменная с именем $sum (и значением undef). При выходе из подпрограммы Perl отбрасывает эту локальную переменную и восстанавливает предыдущее (глобальное) значение. Эта схема работает даже в том случае, если переменная $sum в текущий момент является локальной переменной, взятой из другой подпрограммы (той, которая вызывает данную подпрограмму, или той, которая вызывает ту, которая вызывает данную подпрограмму, и т.д.). Переменные могут иметь много вложенных локальных версий, но одновременно разрешается обращаться только к одной из них.

Вот способ создания списка всех элементов массива, значения которых превышают число 100:

sub bigger than 100 {

my (@result); # временная для хранения возвращаемого значения

foreach $ (@ ) { # проход по списку аргументов if (S > 100) ( # подходит?

push(@result,$ ); # прибавить

return gresult; # возвратить окончательный список

Что, если бы нам понадобились все элементы, значения которых превышают 50, а не 100? Пришлось бы отредактировать программу, заменив 100 на 50. А если бы нам было нужно и то, и другое? В этом случае следовало бы заменить 50 или 100 ссылкой на переменную. Тогда программа выглядела бы так:

sub bigger than {

my($n,@values); # создать локальные переменные

($n,@values} = @ ; # выделить из списка аргументов значение предела

# и элементы массива

ту (Sresult); # временная переменная для хранения возвращаемого

# значения

foreach $ (@values) ( # проход по списку аргументов if ($ > Sn) ( # подходит?

push(@result,$ ); # прибавить

@result; # возвратить окончательный список

# примеры вызова:

@new = bigger than (100, glist) ; # @new содержит все значения (aiist> 100 (athis = bigger than (5,1, 5, 15, 30) ; # lathis содержит значение (15,30)



Обратите внимание: в этот раз мы использовали еще две локальные переменные, чтобы присвоить имена аргументам. Это - весьма распространенная практика, потому что гораздо удобнее (да и безопаснее) использовать переменные $п и $ values, чем указывать $ [0] и @ [1. .$# ].

В результате выполнения операции ту создается список, который можно использовать в левой части операции присваивания. Этому списку можно присваивать начальные значения для каждой из вновь созданных переменных. (Если значения списку не присвоить, то новые переменные вначале получат значение undef, как и любая другая переменная.) Это значит, что мы можем объединить первые два оператора этой подпрограммы, т.е. операторы

my($n,@values);

($n,@values) = @ ; # выделить из списка аргументов значение предела # и элементы массива

заменить на

ту(Sn,@values)= @ ;

Этот прием очень распространен в Perl. Локальным переменным, не являющимся аргументами, можно таким же способом присваивать литеральные значения, например:

ту(Ssum) =0; # инициализировать локальную переменную

Имейте в виду, что, несмотря на наличие объявления, ту в действительности представляет собой выполняемую операцию. Стратегия правильной работы в Perl состоит в том, что все операции ту должны быть размещены в начале определения подпрограммы, до того, как начинается реализация основных выполняемых в ней действий.

Полу локальные переменные, созданные при помощи функции local

в Perl существует еще один способ создания "частных" локальных переменных - с помощью функции local. Важно понять различия между ту и local. Например:

Svalues = "original";

tellme О ; spoof о; tellme О; sub spoof {

local (Svalue) = "temporary"; tellme 0;

sub tellme {

print "Current value is Svalue\n";

8. Функции 11



На выходе получаем следующее:

Current value is original Current value is temporary Current value is original

Если бы вместо local мы использовали my, то локальный вариант переменной $ value был бы доступен только в пределах подпрограммы spoof О . При использовании функции local, как видно по результатам программы, это локальное значение не совсем локальное; оно доступно и во всех остальных подпрограммах, вызываемых из spoof (). Общее правило таково: локальные переменные доступны для функций, вызываемых из того блока, в котором эти функции объявлены.

Операцию ту можно использовать только для объявления простых скалярных переменных, переменных-массивов и хеш-переменных с буквенно-цифровыми именами, тогда как для переменной local такие ограничения не установлены. Кроме того, встроенные переменные Perl, такие как 5 , #1 и @ARGV, с помощью ту объявлять нельзя, а вот с local они работают прекрасно. Поскольку $ используется в большинстве Peri-программ, то будет, вероятно, разумным помещать строку

local $ ;

в начало любой подпрограммы, которая использует $ для собственных нужд. Это гарантирует сохранность предыдущего значения и его автоматическое восстановление при выходе из подпрограммы.

На более серьезном уровне программирования вам, возможно, нужно будет знать, что переменные, создаваемые функцией local, - это, по сути дела, замаскированные глобальные переменные, т.е. значение глобальной переменной сохраняется и временно заменяется локально объявленным значениед.

В большинстве случаев рекомендуем использовать не local, а ту, потому что эта операция действует быстрее и надежнее.

Создаваемые операцией ту() переменные файлового уровня

Операцию ту () можно также использовать на внешнем уровне программы, вне всех подпрограмм и блоков. Хотя в результате не будет получена "локальная" переменная в описанном выше смысле, это может оказаться достаточно полезным, особенно при использовании в сочетании с Vrl-npazMoit

use strict;

Прагма - это директива компилятора. Среди этих директив ~ директивы задания целочисленных арифметических операций, перегрузки числовых операций, запрашийания дополнительных текстовых предупреждений и сообщений об ошибках. Эти директивы описаны в главе 7 книги Programming Perl и на man-странице perlmodlib(\).



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [ 41 ] 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103