Forum Webscript.Ru
Программирование => Perl => Тема начата: 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
И еще один вопросик, из демки вдно что при очередном вызове функции выделяется память подновые переменные
а старая не чистится или я четот не понял?
-
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. Ничего там "чистится" и не должно.
-
Billi
perldoc -q lexical
What\'s the difference between dynamic and lexical (static) scoping? Between local() and my()?
...
-
Тоесть, если я правильно понял действие переменной local
распровстраняется на блок и на все функции вызвваемые из данного блока, а my работает только вданном блоке и
вызываемые ф-и не распрастранется?
Какой тип из данныйх типов обьявления экономичнее (с точки зрения памяти) использовать?
Если процедутра не освобождает за собой память,
есть ли способ освоботь ее?