我知道myPerl中有什么.它定义了一个仅存在于定义它的块范围内的变量.怎么our办?有our什么不同my?
我查了几个处理这个警告的答案,但他们也没有帮助我,也没有真正理解Perl在这里做的事情.这就是我想要做的事情:
sub outerSub {
my $dom = someBigDOM;
...
my $otherVar = innerSub();
return $otherVar;
sub innerSub {
my $resultVar = doStuffWith($dom);
return $resultVar;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我有一个存储在$ dom中的大DOM对象,如果可能的话我不想在堆栈中传递.在outerSub中,正在发生需要来自innerSub的结果的东西.innerSub需要访问$ dom.当我这样做时,我收到这个警告"变量$ dom将不会保持共享".
我不明白的是:
这个警告对我有疑虑吗?我的逻辑会在这里运作还是会发生奇怪的事情?
如果它不能按预期工作:是否可以这样做?使局部变量对嵌套子变得可见?或者将它作为参数传递更好?或者声明一个"我们的"变量是否更好?
如果我将它作为参数推送,整个对象及其所有数据(可能有几个MB)是否会被推入堆栈?或者我可以传递类似参考的东西?或者Perl是否将该参数作为参考单独处理?
在"变量$ foo将不会保持共享"Perl中的警告/错误在调用子例程时,有人会谈论一个匿名子,这将使这成为可能.我不明白它是如何工作的,从来没有使用过这样的东西.
我根本不理解这个解释(可能导致英语不是我的第一语言):"当调用内部子程序时,它将看到外部子程序变量的值,就像它在第一次调用外部子程序之前和期间一样. ;在这种情况下,在第一次调用外部子程序完成后,内部子程序和外部子程序将不再共享变量的公共值.":
"对外部子程序的第一次调用是完整的是什么意思?"
我的意思是:首先我称之为外部子程序.外部子调用内部子.外子当然还在运行.一旦外部子完成,内部子也将完成.那么当内部子已经完成时,这仍然适用于什么呢?那么"第一次"召唤呢?什么时候发生"第二次"通话......对不起,这个解释让我感到困惑.
对不起,有很多问题.也许有人至少可以回答其中一些问题.
我有一个奇怪的表现(对Python程序员)子程序,其简化如下:
use strict;
use Data::Dumper;
sub a {
my @x;
sub b { push @x, 1; print "inside: ", Dumper(\@x); }
&b;
print "outside: ", Dumper(\@x);
}
&a;
&a;
Run Code Online (Sandbox Code Playgroud)
我发现结果是:
inside: $VAR1=[ 1 ]
outside: $VAR1 = [ 1 ]
inside: $VAR1=[1, 1]
outside: $VAR1= []
Run Code Online (Sandbox Code Playgroud)
我还以为是打电话时&a,@x是空数组后" my @x"之后有一个元素" &b",然后死了.我每次打电话&a都是一样的.所以输出应该是全部$VAR1 = [ 1 ].
然后我读了一些像命名子例程在符号表中定义一次,然后我做" my $b = sub { ... }; &$b;",这对我来说似乎有意义.
如何解释?