Я просмотрел несколько ответов, касающихся этого предупреждения, но они также не помогли мне, и я действительно не понимаю, что делает Perl здесь вообще. Вот что я хочу, чтобы это сделать:Perl: «Переменная не будет использоваться совместно»
sub outerSub {
my $dom = someBigDOM;
...
my $otherVar = innerSub();
return $otherVar;
sub innerSub {
my $resultVar = doStuffWith($dom);
return $resultVar;
}
}
Так в основном, у меня есть большой объект DOM, хранящийся в $ йоте, что я не хочу, чтобы пройти в стеке, если это возможно. В outerSub происходит что-то, что требует результатов от innerSub. innerSub нуждается в доступе к $ dom. Когда я это сделаю, я получаю это предупреждение: «Переменная $ dom не останется открытой».
То, что я не понимаю:
ли это предупреждение касается меня здесь? Будет ли моя предполагаемая логика работать здесь или будут ли странные вещи?
Если он не работает должным образом: возможно ли это сделать? Сделать локальный var видимым для вложенного суб? Или лучше просто передать это как параметр? Или лучше объявить «нашу» переменную?
Если я вытолкнул его как параметр, будет ли весь объект со всеми его данными (может иметь несколько МБ) вставить в стек? Или я могу просто передать что-то вроде ссылки? Или Perl обрабатывает этот параметр как ссылку самостоятельно?
В "Variable $foo will not stay shared" Warning/Error in Perl While Calling Subroutine, кто-то говорит об анонимном субблоке, который сделает это возможным. Я не понимал, как это работает, никогда не использовал ничего подобного.
Я вообще не понимаю этого объяснения (может быть, английский не является моим первым языком): «Когда вызывается внутренняя подпрограмма, она увидит значение переменной внешней подпрограммы, как это было до и во время первого звонить внешнюю подпрограмму, в этом случае, после первого вызова внешней подпрограммы завершен, внутренние и внешние подпрограммы больше не будут делить общее значение для переменного «:
Что значит». первый вызов внешней подпрограммы завершен? означает «
Я имею в виду: сначала я называю внешний суб. Внешний sub вызывает внутренний sub. Внешняя часть, конечно же, все еще работает. Как только внешняя часть будет завершена, внутренняя часть будет закончена. Тогда как это все еще применяется, когда внутренняя часть уже завершена? А как насчет «первого» звонка? Когда происходит «второй» звонок ... извините, это объяснение смущает меня до конца.
Извините за много вопросов. Может быть, кто-то может хотя бы ответить на некоторые из них.
Странный язык действительно .... спасибо. – jackthehipster
Thx для уточнения. Означает ли это, что, когда innerSub обращается к $ dom, он каким-то образом уничтожает его? Что такое innerSub в последующих вызовах, если не тот же $ dom, что и внешнийSub? – jackthehipster
добавленный информация – ysth