相关疑难解决方法(0)

我和Perl之间的区别是什么?

我知道myPerl中有什么.它定义了一个仅存在于定义它的块范围内的变量.怎么our办?有our什么不同my

perl scope

184
推荐指数
7
解决办法
11万
查看次数

Perl:"变量不会保持共享"

我查了几个处理这个警告的答案,但他们也没有帮助我,也没有真正理解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将不会保持共享".

我不明白的是:

  1. 这个警告对我有疑虑吗?我的逻辑会在这里运作还是会发生奇怪的事情?

  2. 如果它不能按预期工作:是否可以这样做?使局部变量对嵌套子变得可见?或者将它作为参数传递更好?或者声明一个"我们的"变量是否更好?

  3. 如果我将它作为参数推送,整个对象及其所有数据(可能有几个MB)是否会被推入堆栈?或者我可以传递类似参考的东西?或者Perl是否将该参数作为参考单独处理?

  4. "变量$ foo将不会保持共享"Perl中的警告/错误在调用子例程时,有人会谈论一个匿名子,这将使这成为可能.我不明白它是如何工作的,从来没有使用过这样的东西.

  5. 我根本不理解这个解释(可能导致英语不是我的第一语言):"当调用内部子程序时,它将看到外部子程序变量的值,就像它在第一次调用外部子程序之前和期间一样. ;在这种情况下,在第一次调用外部子程序完成后,内部子程序和外部子程序将不再共享变量的公共值.":

"对外部子程序的第一次调用是完整的是什么意思?"
我的意思是:首先我称之为外部子程序.外部子调用内部子.外子当然还在运行.一旦外部子完成,内部子也将完成.那么当内部子已经完成时,这仍然适用于什么呢?那么"第一次"召唤呢?什么时候发生"第二次"通话......对不起,这个解释让我感到困惑.

对不起,有很多问题.也许有人至少可以回答其中一些问题.

variables perl local

16
推荐指数
3
解决办法
3539
查看次数

为什么"我的@variable"在sub中并且由sub/sub修改的行为如此奇怪

我有一个奇怪的表现(对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;",这对我来说似乎有意义.

如何解释?

perl scope subroutine

4
推荐指数
1
解决办法
163
查看次数

标签 统计

perl ×3

scope ×2

local ×1

subroutine ×1

variables ×1