|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Andrey Sapozhnikov 2:5020/400 27 Feb 2002 01:22:27 To : Nelly Sadretdinova Subject : Re: mod_perl&nesting subroutines -------------------------------------------------------------------------------- "Nelly Sadretdinova" <nelly@ufanet.ru> wrote in message news:a5gi4o$ca7$1@www.ufanet.ru... > Решила попробовать mod_perl как альтернативу FastCGI. > Столкнулась тут же с проблемой именуемой в руководстве nested subroutines. > > т.е. например (упрощенно), имеем кусок кода > > use strict; > my %V; > > $V{a} = 1; > test(); > ... > > sub test > { > .... > my $c = "test1"; > $V{b} .= $c; > ... > } > > получаем результат > Variable "%V" will not stay shared at ...и $V{b} не обнуляется. > В руководстве во избежании этого предлагается вынести вызов test в отдельную > подпрограмму и все это вместе вынести в отдельный файл. > Хотелось бы узнать, есть ли другие решения этой проблемы.... Масса. Hапример принудительное обнуление + использование use vars qw(%V) вместо my, передача ссылки на %V в test в качестве параметра, редизайн скрипта в OOP... Тут вот в чем дело, функция test на самом деле определена внутри большой, спрятанной от Вас функции которая содержит весь Ваш скрипт. При компиляции функции происходит подстановка адреса переменной %V в скомпилированый код. Дело в том, что переменные определяемые через my (lexical scope) не хранятся в таблицах имен в момент исполнения. При повторном вызове Вашего скрипта (т.е. скрытой функции), в нем происходит создание новой копии переменной %V, вполне себе обнуленой, но функция test продолжает помнить и использовать адрес старой. В итоге, в памяти существует две копии %V - самая первая, запомненная в test и более никому не доступная (если нет еще таких же функций), и самая последняя. Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/6577c81e93e4.html, оценка из 5, голосов 10
|