Анимация
JavaScript
|
Главная Библионтека 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 |