据我所知, my运算符是声明真正具有词法范围的变量,并使用local运算符声明变量来完成动态范围。

任何人都能简单描述一下吗?

===============>>#1 票数:12 已采纳

local($ x)保存全局变量$ x的旧值,并为子例程的持续时间分配一个新值,该值在从该子例程调用的其他函数中可见。 这是在运行时完成的,因此称为动态范围。 local()总是影响全局变量,也称为包变量或动态变量。

my($ x)创建一个仅在当前子例程中可见的新变量。 这是在编译时完成的,因此称为词法或静态作用域。 my()总是影响私有变量,也称为词法变量或(不正确地)静态(缩放)变量。

看看Perl-FAQ的

===============>>#2 票数:10

MJD在1998年解释了这一点

my创建了一个局部变量。 local没有。

===============>>#3 票数:6

我将添加一个简单的例子。

$var = "Global";

sub inner {
    print "inner:         $var\n";
}

sub changelocal {
    my $var = "Local";
    print "changelocal:   $var\n";

    &inner
}

sub changedynamic {
    local $var = "Dynamic";
    print "changedynamic: $var\n";

    &inner
}

&inner
&changelocal
&changedynamic

这给出了以下输出(添加了注释)。

inner:         Global  # Finds the global variable.
changedynamic: Dynamic # Dynamic variable overrides global.
inner:         Dynamic # Find dynamic variable now.
changelocal:   Local   # Local variable overrides global.
inner:         Global  # The local variable is not in scope so global is found.

您可以将动态变量视为屏蔽所调用函数的全局变量的方法。 词法范围变量只能从最近的大括号内的代码中看到。

  ask by Anil translate from so

未解决问题?本站智能推荐: