PERL: БИБЛИОТЕКА ПРОГРАММИСТА



              

PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 351



368   Глава 10 • Подпрограммы

глобальных, а не локальных переменных, директива use st net ни к чему хороше­му не приведет.

Оператор local создает динамическую область действия. Она отличается от дру­гой области действия, поддерживаемой Perl и значительно более понятной на интуитивном уровне. Речь идет об области действия ту — лексической области действия, иногда называемой «статической».

В динамической области действия переменная доступна в том случае, если она находится в текущей области действия — или в области действия всех кадров (бло­ков) стека, определяемых во время выполнения. Все вызываемые функции облада­ют полным доступом к динамическим переменным, поскольку последние остаются глобальными, но получают временные значения. Лишь лексические переменные защищены от вмешательства извне. Если и это вас не убедит, возможно, вам будет интересно узнать, что лексические переменные примерно на 10 процентов быст­рее динамических.

Старый фрагмент вида:

sub func {

local($x    $y) = @_

# }

почти всегда удается заменить без нежелательных последствий следующим фраг­ментом:

sub func {

my($x,  $y) = @_,

# }

Единственный случай, когда подобная замена невозможна, — если работа про­граммы основана на динамической области действия. Это происходит в ситуа­ции, когда одна функция вызывает другую и работа второй зависит от доступа к временным версиям глобальных переменных $х и $у первой функции. Код, кото­рый работает с глобальными переменными и вместо нормальной передачи пара­метров издалека вытворяет нечто странное, в лучшем случае ненадежен. Хорошие программисты избегают подобных выкрутасов как чумы.

Если вам встретится старый код вида:

&func(*Global_Array) sub func {

local(*aliased_array) = shift,

for (@>aliased_array)  {          }

}

вероятно, его удастся преобразовать к следующей форме:

f unc(\(°>Global_Array), sub func  {

my $array_ref    = shift

for ((g>$array_ref)  {              }


10.14. Переопределение функции   369




Содержание  Назад  Вперед