Область видимости Perl и жизнь локальных переменных - PullRequest
11 голосов
/ 15 апреля 2011

Сколько времени занимает область памяти, выделенная локальной переменной в Perl (для массивов, хэшей и скаляров)? Например:

sub routine
{  
  my $foo = "bar";  
  return \$foo;  
}  

Можете ли вы получить доступ к строке "bar" в памяти после возврата функции? Как долго он будет жить, и будет ли он похож на статическую переменную в C или больше на переменную, объявленную в куче?

В принципе, имеет ли это смысл в этом контексте?

$ref = routine()  
print ${$ref};

1 Ответ

21 голосов
/ 15 апреля 2011

Да, этот код будет работать нормально.

Perl использует подсчет ссылок , поэтому переменная будет существовать до тех пор, пока на нее ссылаются. Perl * лексические переменные в некотором роде похожи на автоматические переменные C, потому что они обычно исчезают, когда вы покидаете область видимости, но они также похожи на переменную в куче, потому что вы можете вернуть ссылку на нее и ее будет просто работать.

Они не похожи на статические переменные C, потому что вы получаете новый $foo каждый раз, когда вызываете routine (даже рекурсивно). (В Perl 5.10 введены state переменные , которые скорее похожи на статический Си.)

...