Шаг 113.
Функция local()

    На этом шаге мы рассмотрим использование функции local().

    Функция local() также используется для объявления и инициализации переменных:

local EXPR;
local ($myvar, @mylist, %myhash);
local $pi = 3.14159;
local ($pi, $exp) = (3.14159, 2.71828);
но, в отличие от функции my() она создает не локальные переменные, а временные значения для глобальных переменных внутри: в зависимости от того, в каком месте вызвана для объявления переменных сама функция local(). Если функция local() применяется для описания нескольких переменных, они должны быть заключены в скобки. Если глобальная переменная, объявленная при помощи этой функции, ранее встречалась до объявления и имела некоторое значение, то это значение сохраняется в скрытом стеке и восстанавливается после выхода соответственно из подпрограммы, блока, функции eval() или файла. Переменная, объявленная при помощи функции local(), или, точнее, ее временное значение, доступна для любой функции, вызванной внутри подпрограммы, блока, функции eval() или файла, в которых сделано объявление. Такую переменную называют динамической, а ее область видимости - динамической областью видимости. В названии отражается тот факт, что область видимости переменной динамически изменяется с каждым вызовом функции, получающей доступ к этой переменной.

    Функция my() является относительно новой, она появилась в версии Perl 5. Для создания действительно локальных переменных рекомендуется использовать именно функцию my(), а не функцию local(). Впрочем, есть несколько исключений.

    В следующем примере показано, чем отличаются переменные, объявленные при помощи функций my() и local ().

#! perl -w
sub f1
{
  local ($x) = "aaaa";
  my($y) =  "bbbb";
  print("f1: x = $x\n");
  print("f2: y = $y\n\n");
  f2();
  print("f1: x = $x\n");
  print("f1: y = $y\n\n");
}
sub f2
{
  print("f2: x = $x\n");
  print("f2: y = $y\n\n");
  $x = "сссс";
  $y = "dddd";
  print("f2: x = $x\n");
  print("f2: y = $y\n\n");
 } 
f1;
Текст этого примера можно взять здесь.

    Результат его работы приведен на рисунке 1.


Рис.1. Результат работы приложения

    Как видно из приведенного результата, функция f2() не имеет доступа к переменной , объявленной при помощи функции my() внутри функции f1(), и, напротив, имеет доступ к переменной , объявленной внутри f1() при помощи функции local() .

    Со следующего шага мы начнем знакомиться с передачей параметров.




Предыдущий шаг Содержание Следующий шаг