Язык программирования Perl

         

Области видимости переменных


В Perl переменные по умолчанию видимы в пределах всей программы (точнее, в пределах пакета, но об этом будет рассказано позднее). Практика доказала, что использование глобальных переменных противоречит принципу модульности, поскольку связывает части программы зависимостями от глобальных данных. Поэтому во всех языках программирования предусмотрены средства ограничения видимости переменных. Как уже упоминалось в лекции 2, в Perl это делается с помощью объявления переменных. Чтобы ограничить видимость переменных рамками блока или подпрограммы, нужно объявить для них лексическую область видимости с помощью функции my(), как это уже делалось в приводимых ранее примерах. Когда при помощи my объявляется несколько переменных, то все они должны заключаться в круглые скобки, как показано ниже:

my ($var1, $var2, $var3) = (1, 2, 3); # правильно # запись my ($var1=1, $var2=2, $var3=3) ошибочна my $var4 = 4, $var5 = 5; # $var5 - глобальная, а не my

Чтобы проследить, как изменяются значения переменных, объявленных в главной программе и подпрограммах, внимательно прочитайте следующий пример (скучный, но полезный для понимания):

use strict; my $var = 'm'; # лексическая $var в main print "1(main)='$var'\n"; # выведет: 1(main)='m' sub1(); print "7(main):'$var'\n"; # выведет: 7(main):'z'

sub sub1 { print "2(sub1)='$var'"; $var = 's'; # изменяется $var из main! print "-->'$var'\n"; # выведет: 2(sub1)='m'-->'s' my $var = '1'; # изменена $var1 из sub1 print "3(sub1)='$var'\n"; # выведет: 3(sub1)='1' sub2(); # снова видима $var1 из sub1 print "6(sub1):'$var'\n"; # выведет: 6(sub1):'1' } sub sub2 { # снова видима $var из main print "4(sub2):'$var'"; $var = 'z'; # изменяется $var из main!! print "-->'$var'\n"; # выведет: 4(sub2):'s'-->'z' my $var = '2'; # изменена $var1 из sub2 print "5(sub2)='$var'\n"; # выведет: 5(sub2)='2' }

Обратите внимание, что лексическая переменная $var, объявленная в главной программе, видима в обеих подпрограммах sub1 и sub2, поскольку они статически объявлены в рамках той же программы. Но при выполнении программы в подпрограмме sub2 не видима переменная $var, объявленная в процедуре sub1. Из приведенного примера видно, что после объявления в подпрограмме лексических переменных с помощью my(), изменения этих переменных не затрагивают других переменных с теми же именами. Поэтому, чтобы избежать нежелательного изменения значений переменных в других частях программы, рекомендуется всегда объявлять для переменных лексическую область видимости. Проконтролировать наличие объявлений для переменных в программе поможет прагма use strict. Другая разновидность лексических переменных, описываемых с помощью функции our, будет рассмотрена в следующей лекции.



Содержание раздела