Perl: «Переменная не останется общей»

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

sub outerSub {
  my $dom = someBigDOM;
  ...
  my $otherVar = innerSub();
  return $otherVar;

  sub innerSub {
    my $resultVar = doStuffWith($dom);
    return $resultVar;
  }
}

В общем, у меня есть большой DOM-объект, хранящийся в $ dom, который я не хочу передавать в стеке, если это возможно. В outerSub происходит то, что требует результатов от innerSub. innerSub нужен доступ к $ dom. Когда я делаю это, я получаю это предупреждение «Переменная $ dom не будет оставаться общей».

Что я не понимаю:

Это предупреждение касается меня здесь? Будет ли здесь работать моя логика или будут происходить странные вещи?

Если это не работает как задумано: возможно ли это сделать? Чтобы сделать локальную переменную видимой для вложенной подпрограммы? Или лучше просто передать его в качестве параметра? Или лучше объявить «нашу» переменную?

Если я добавлю его в качестве параметра, будет ли весь объект со всеми его данными (может иметь несколько МБ) помещаться в стек? Или я могу просто передать что-то вроде ссылки? Или Perl сам обрабатывает этот параметр как ссылку?

В«Переменная $ foo не будет оставаться общей» Предупреждение / Ошибка в Perl при вызове подпрограммыкто-то говорит об анонимном сабе, который сделает это возможным. Я не понимал, как это работает, никогда не использовал ничего подобного.

Я вообще не понимаю этого объяснения (может быть, потому, что английский не мой родной язык): «Когда вызывается внутренняя подпрограмма, она увидит значение переменной внешней подпрограммы, как было до и во время первого вызова внешней подпрограммы. ; в этом случае после завершения первого вызова внешней подпрограммы внутренняя и внешняя подпрограммы больше не будут иметь общего значения для переменной. ":

Что означает «первый вызов внешней подпрограммы завершен?»
Я имею в виду: сначала я называю внешний саб. Внешняя подпрограмма вызывает внутреннюю подпрограмму. Внешний саб, конечно, все еще работает. Как только внешний саб завершен, внутренний саб также будет завершен. Тогда как же все это применимо, когда внутренняя подпрограмма уже закончена? А как насчет «первого» звонка? Когда происходит "второй" звонок ... извините, это объяснение смущает меня до бесконечности.

Извините за много вопросов. Может быть, кто-то может хотя бы ответить на некоторые из них.

Ответы на вопрос(3)

Ваш ответ на вопрос