2011-12-12 52 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. 

您可以將動態變量想象爲掩蓋您調用的函數的全局。詞彙作用域變量只能從最近的大括號內的代碼中看到。

相關問題