Автор Тема: Зоны видимости (my local)  (Прочитано 2665 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Billi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Зоны видимости (my local)
« : 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

И еще один вопросик, из демки вдно что при очередном вызове функции выделяется память подновые переменные
а старая не чистится или я четот не понял?
Но я хотя бы знаю, что ни чего не знаю

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Зоны видимости (my local)
« Ответ #1 : 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. Ничего там "чистится" и не должно.
0 OK, 0:1

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
Зоны видимости (my local)
« Ответ #2 : 08 Мая 2004, 21:40:45 »
Billi
Цитировать
perldoc -q lexical
What\'s the difference between dynamic and lexical (static) scoping?  Between local() and my()?
...
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Billi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Зоны видимости (my local)
« Ответ #3 : 09 Мая 2004, 14:20:37 »
Тоесть, если я правильно понял действие переменной local
распровстраняется на блок и на все функции вызвваемые из данного блока, а my работает только вданном блоке и
вызываемые ф-и не распрастранется?

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

Если процедутра не освобождает за собой память,
есть ли способ освоботь ее?
« Последнее редактирование: 09 Мая 2004, 14:42:41 от Billi »
Но я хотя бы знаю, что ни чего не знаю

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28