|
Локальные переменные в подпрограммах
Областью видимости
или областью действия переменной мы будем называть часть программы,
где данная переменная может быть использована. В языке Perl, как мы знаем, нет
обязательного явного описания переменных. Точкой определения переменной является
место, где она впервые встречается в программе. Область действия большинства
переменных ограничена пакетом. Исключение составляют некоторые специальные
предопределенные глобальные переменные интерпретатора peri. Пакет — это механизм,
позволяющий создать свое пространство имен для некоторого отрезка программы
(этот отрезок может включать всю программу). Каждый фрагмент кода Perl-лрограммы
относится к соответствующему пакету.
(Пакеты рассматриваются в
части 12 , а специальные переменные
— в части 14 )
Таким образом, переменная, впервые
встретившаяся- в некоторой подпрограмме, становится доступной во всем пакете,
к которому эта подпрограмма принадлежит. Любая переменная в Perl по умолчанию
считается глобальной, но эта глобальность ограничена рамками пакета. Иногда
бывает необходимо ограничить область действия переменной рамками подпрограммы
или блока, в которых она определена. Такие переменные называются локальными.
В языке Perl существуют два способа описания локальных переменных: при
ПОМОЩИ ФУНКЦИЙ my() И local ()
.
Функция
ту()
Функция ту о используется для
объявления одной или нескольких переменных локальными:
my EXPR
и ограничивает их область действия:
- подпрограммой;
- заключенным в фигурные скобки
блоком операторов;
- выражением, переданным на выполнение
функции eval ();
- файлом, в зависимости от того,
в каком месте вызвана для объявления переменных сама функция my ().
Если выражение 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);
но, в отличие от функции ту о
она создает не локальные переменные, а временные значения для глобальных переменных
внутри:
- подпрограммы;
- заключенного в фигурные скобки
блока операторов;
- выражения, переданного на выполнение
функции eval ();
- файла;
в зависимости от того, в каком
месте вызвана для объявления переменных сама функция 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 () .
|