Perl中的词法和动态范围有什么区别?

Ani*_*nil 15 perl scope

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

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

Clo*_*ble 12

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

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

看看Perl-FAQ的:

  • "my($ x)创建一个只在当前子程序中可见的新变量".事实并非如此.`my`创建一个新变量,只在当前*代码块*中可见.子程序只是块的一个例子.你在`local`的定义中犯了类似的错误. (6认同)

Sin*_*nür 10

MJD在1998年解释了这一点:

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


Kev*_*Cox 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
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

您可以将动态变量视为屏蔽所调用函数的全局变量的一种方法。词汇范围变量仅在最近括号内的代码中可见。