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

时间:2011-12-12 11:42:59

标签: perl scope

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

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

3 个答案:

答案 0 :(得分:12)

  

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

     

my($ x)创建一个仅在当前可见的新变量   子程序。这是在编译时完成的,所以它被称为词法或   静态范围。 my()总是影响私有变量,也称为私有变量   词汇变量或(不正确地)静态(缩放)变量。

查看Perl-FAQ's

答案 1 :(得分:10)

MJD explained this in 1998

  

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

答案 2 :(得分: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.

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