Forum Webscript.Ru

Программирование => Perl => Тема начата: Billi от 08 Мая 2004, 19:34:42

Название: Зоны видимости (my local)
Отправлено: Billi от 08 Мая 2004, 19:34:42
Чем отличаются отределения переменых my и local?
я провел небольшой тест и разници не увидел
sub test($)
{ my $data="Stels$_[0]"; return(\\$data);}
$empty=test(21);
print "Stels21 = ${$empty}\\n";
$empty2=test(22);
print "Stels22 = ${$empty2}\\n";
print "Stels22 = ${$empty}\\n"; #Странно выходит после вызова память не чистится
===================
Stels21 = Stels21
Stels22 = Stels22
Stels22 = Stels21
===================
Результат получился одинаковым как c my так и с local

И еще один вопросик, из демки вдно что при очередном вызове функции выделяется память подновые переменные
а старая не чистится или я четот не понял?
Название: Зоны видимости (my local)
Отправлено: ondr от 08 Мая 2004, 21:29:14
1.

my - резервирование имени переменной типов scalar, array, hash, в локальной таблице имен, по

отношению к блоку.
local - создание временной копии, по отношению к блоку.

директива my появилась лишь в 5-ой версии perl, до этого пользовались только директивой local.

Счас применение local оправданно лишь в случаях, когда нужно локальное действие системной

переменной, переменной типа typeglob или временное действие элемента массива. Во всех остальных

случаях strict будет ругаться. Используй это.

Пример local($_,*F,$hash{key},$array[2]);

Более живой пример:

my $cnt;
open(F,">file2");

{   local(*F); # Локальная копия F (typeglob). Предыдущий открытый файл не закроется при этом.
    open(F,"    read(F,$cnt,-s "file1");
    close(F);
}

print F $cnt;
close(F);

Еще:

{  local $0=\'bla bla\';
   print $0."\\n";
}

   print $0;

2.

ты каждый раз создаешь новую(!) копию переменной $data. Ничего там "чистится" и не должно.
Название: Зоны видимости (my local)
Отправлено: Wyclef от 08 Мая 2004, 21:40:45
Billi
Цитировать
perldoc -q lexical
What\'s the difference between dynamic and lexical (static) scoping?  Between local() and my()?
...
Название: Зоны видимости (my local)
Отправлено: Billi от 09 Мая 2004, 14:20:37
Тоесть, если я правильно понял действие переменной local
распровстраняется на блок и на все функции вызвваемые из данного блока, а my работает только вданном блоке и
вызываемые ф-и не распрастранется?

Какой тип из данныйх типов обьявления экономичнее (с точки зрения памяти) использовать?

Если процедутра не освобождает за собой память,
есть ли способ освоботь ее?