Локальные переменные в подпрограммах Областью видимости или областью действия переменной мы будем называть часть программы, где данная переменная может быть использована. В языке Perl, как мы знаем, нет обязательного явного описания переменных. Точкой определения переменной является место, где она впервые встречается в программе. Область действия большинства переменных ограничена пакетом. Исключение составляют некоторые специальные предопределенные глобальные переменные интерпретатора peri. Пакет — это механизм, позволяющий создать свое пространство имен для некоторого отрезка программы (этот отрезок может включать всю программу). Каждый фрагмент кода Perl-лрограммы относится к соответствующему пакету. (Пакеты рассматриваются в части 12 , а специальные переменные — в части 14 ) Таким образом, переменная, впервые встретившаяся- в некоторой подпрограмме, становится доступной во всем пакете, к которому эта подпрограмма принадлежит. Любая переменная в Perl по умолчанию считается глобальной, но эта глобальность ограничена рамками пакета. Иногда бывает необходимо ограничить область действия переменной рамками подпрограммы или блока, в которых она определена. Такие переменные называются локальными. В языке Perl существуют два способа описания локальных переменных: при ПОМОЩИ ФУНКЦИЙ my() И local () . Функция ту() Функция ту о используется для объявления одной или нескольких переменных локальными: my EXPR и ограничивает их область действия:
Если выражение EXPR содержит список переменных, то он должен быть заключен в скобки: my ($myvar, @mylist, %myhash); Одновременно с объявлением переменные могут быть инициализированы: my $pi = 3.14159; ту ($pi, $exp) = (3.14159, 2.71828); Переменные, объявленные при помощи функции ту (), доступны в своей области действия только для подпрограмм, определенных в этой области. Для подпрограмм, определенных за ее пределами, они недоступны. Такие переменные называют лексическими, а саму область видимости — лексической или статической областью видимости. Функция lосаl () Функция local () также используется для объявления и инициализации переменных: local EXPR; local ($myvar, @mylist, %myhash); local $pi = 3.14159; local ($pi, $exp) = (3.14159, 2.71828); но, в отличие от функции ту о она создает не локальные переменные, а временные значения для глобальных переменных внутри:
в зависимости от того, в каком месте вызвана для объявления переменных сама функция local (). Если функция local () применяется для описания нескольких переменных, они должны быть заключены в скобки. Если глобальная переменная, объявленная при помощи этой функции, ранее встречалась до объявления и имела некоторое значение, то это значение сохраняется в скрытом стеке и восстанавливается после выхода соответственно из подпрограммы, блока, функции eval (} или файла. Переменная, объявленная при помощи функции local (), или, точнее, ее временное значение, доступна для' любой функции, вызванной внутри подпрограммы, блока, функции eval о или файла, в которых сделано объявление. Такую переменную называют динамической, а ее область видимости — динамической областью видимости. В • названии отражается тот факт, что область видимости переменной динамически изменяется с каждым вызовом функции, получающей доступ к этой переменной. Функция ту о является относительно новой, она появилась в версии Perl 5. Для создания действительно локальных переменных рекомендуется использовать именно функцию ту о, а не функцию local о. Впрочем, есть несколько исключений. О них мы расскажем ниже. В следующем примере показано, чем отличаются переменные, объявленные При ПОМОЩИ функций mу () и local () . sub fl{ local ($x) = "aaaa"; my($y) = "bbbb"; print("fl: x = $x\n"); print("fl: y='$y\n\n"); f 2 (} ; print("fl: x = $x\n"); print("fl: у = $y\n\n"); } • ' ' ' sub f2{ print("f2: x = $x\n"); print("f2: y=$y\n\n"); $x = "cccc"; $y = "dddd"; print("f2: x = $x\n"); print("f2: y=$y\n\n"); I Результатом выполнения данного примера будет следующий вывод: II л = aaaa f. у = bbbb , 2: x — aaaa с2: у = f2: x = cccc £2: у = dddd fl: x = cccc fl: у = bbbb Как видно из приведенного результата, функция f2 () не имеет доступа к переменной $у, объявленной при помощи функции ту о внутри функции fi () , и, напротив, имеет доступ к переменной $х, объявленной внутри fl () при ПОМОЩИ функции local () . Поделитесь этой записью или добавьте в закладки | Полезные публикации |