2011-12-12 88 views

回答

11

本地($ X)节省掉全局变量$ x的旧值和 分配的子程序的持续时间是从子程序调用的其他功能 可见一个新值。这在运行时完成 ,所以称为动态作用域。 local()总是影响全局变量,也称为包变量或动态变量。

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

Perl-FAQ's看看:

+0

非常感谢你 – Anil

+6

“my($ x)创建一个只在当前子程序中可见的新变量”。那是不正确的。 'my'创建一个只在当前*代码块*中可见的新变量。一个子程序只是一个块的一个例子。你在'local'的定义中出现类似的错误。 –

+0

@ O.D http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP

3

我会添加一个快速示例。

$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. 

您可以将动态变量想象为掩盖您调用的函数的全局。词汇作用域变量只能从最近的大括号内的代码中看到。

相关问题