2016-11-13 61 views
3

以下摘錄從perldoc perlmod採取:哪些標識符被認爲是動態的?

package語句聲明的編譯單元在給定的命名空間之中。所述package聲明的範圍是從聲明本身通過封閉塊,eval,或文件的末尾,以先到者爲準(相同範圍作爲my()和local()運算符)。未限定的動態標識符將位於此名稱空間中,除了那些少數標識符(如果不合格),默認爲主包而非當前標識符,如下所述。上述

在「不合格動態標識符」短語的術語「動態」似乎是指未在封裝與my前綴變量。也就是說,在下面的代碼片段中,$v1被認爲是一個動態標識符。是對的嗎?

package Package_1; 

$v1 = "v1_val"; 

my $v2 = "v2_val"; 
+0

它也可以是一個詞法變量,如果在'package'語句之上的'my $ v1'聲明與片段相同的文件中聲明的話。參見文檔[包(http://perldoc.perl.org/functions/package.html)和[在Perl的變量範圍](http://perlmaven.com/scope-of-variables-in-perl )更多信息 –

+0

@Chudong:我認爲* dynamic *的想法在這裏被濫用。目前還不清楚是否是*標識*是動態的(所有的Perl標識符是靜態的)或*值*該標識符是指(大多數Perl值是動態的)。你需要知道什麼? [[*] Perl和''''有什麼區別?](http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in -perl/845382?s = 7)幫助你? – Borodin

+0

@Borodin,如你所說,我想知道這裏「動態」這個詞是什麼意思。 – Chudong

回答

3

的兩種一般類型的可變範圍是動態詞法。基本上,詞彙變量的可見性基於它們在源代碼中的位置,動態變量的可見性在運行時確定。

在Perl中,與my聲明的變量是詞彙和任何其他變量是動態的。這種區分變得直接相關的主要場所是local只能與動態(非my)變量,而不是與詞彙(my)變量中。

參見Perl的常見問題,What's the difference between dynamic and lexical (static) scoping?

+0

Dave在上面的答案中,在句子中,「在Perl中,用my聲明的變量是詞法和任何其他變量都是詞法的」,您是否確實在後者中表示「動態」,而不是「詞法」? – Chudong

+0

@Chudong是的,你理解正確。感謝您的支持!我已經更新瞭解決方案。 –

1

看出區別的最好方法是在代碼:

our $dynamic = 'outside'; 
my $static = 'outside'; 

sub show { 
    print "\tin sub: dynamic $dynamic\n"; 
    print "\tin sub: static $static\n"; 
    print"\n"; 
} 

{ 
    local $dynamic = 'inside'; 
    my $static = 'inside'; 

    print "In block\n"; 
    print "\tinline: dynamic $dynamic\n"; 
    print "\tinline: static $static\n"; 
    show(); 
} 

print "In main\n"; 
print "\tinline: dynamic $dynamic\n"; 
print "\tinline: static $static\n"; 
show(); 

輸出:

In block 
    inline: dynamic inside 
    inline: static inside 
    in sub: dynamic inside 
    in sub: static outside 

In main 
    inline: dynamic outside 
    inline: static outside 
    in sub: dynamic outside 
    in sub: static outside 

注意,子總是看到相同(室外)$static

相關問題