【发布时间】:2014-10-13 12:23:41
【问题描述】:
我查找了一些处理此警告的答案,但它们都没有帮助我,我也完全不了解 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 将不会保持共享”。
我不明白的:
此警告是否与我有关?我的预期逻辑会在这里起作用还是会发生奇怪的事情?
如果不能按预期工作:是否可以这样做?使本地变量对嵌套子可见?还是将它作为参数传递更好?还是声明一个“我们的”变量更好?
如果我将它作为参数推送,是否会将整个对象及其所有数据(可能有几个 MB)推送到堆栈上?或者我可以传递一些类似参考的东西吗?还是 Perl 自己将那个参数作为引用处理?
在"Variable $foo will not stay shared" Warning/Error in Perl While Calling Subroutine 中,有人谈到了一个匿名的子系统,这将使这成为可能。我不明白它是如何工作的,从未使用过类似的东西。
我完全不明白那个解释(可能是因为英语不是我的第一语言):“当调用内部子程序时,它会看到外部子程序变量的值,就像它之前和期间一样第一次调用外部子例程;在这种情况下,在第一次调用外部子例程完成后,内部子例程和外部子例程将不再共享该变量的公共值。":
“对外部子程序的第一次调用完成?是什么意思”
我的意思是:首先我调用外部潜艇。外潜艇调用内潜艇。外部潜艇当然仍在运行。一旦外子完成,内子也将完成。那么当内部子已经完成时,这仍然适用吗?那么“第一个”电话呢? “第二个”电话什么时候发生...对不起,这个解释让我困惑不已。
很抱歉有很多问题。也许有人至少可以回答其中一些。
【问题讨论】: