2017-02-15 25 views

回答

8

@arr是一個全局變量,它在解析器首次遇到時創建,然後在整個包中看到。

use warnings; 
#use strict; 

for (1..3) { 
    #my @arr; 
    for (1..3) { 
     push @arr, $_; 
    } 
} 

print "@arr\n"; 

它打印

 
1 2 3 1 2 3 1 2 3 

這是關於全局不好的事情之一,他們「輻射」整個代碼。

隨着use strict;使我們得到

 
Possible unintended interpolation of @arr in string at scope.pl line 11. 
Global symbol "@arr" requires explicit package name at scope.pl line 7. 
Global symbol "@arr" requires explicit package name at scope.pl line 11. 
Execution of scope.pl aborted due to compilation errors. 

由於strict僅僅是強制執行的聲明,這個有意義的告訴我們,@arr是全球性的(因此隨處可見的代碼)。

聲明它在上面會有相同的效果,但它與未聲明的全局變量不同。 A my變量是詞法和範圍,最近的封閉塊。從my

my聲明列出的變量爲本地網(詞法),以封閉塊,文件,或eval。如果列出多個變量,則列表必須放在括號內。

此外,詞法不在符號表中。

因此,當它在第一個循環(註釋掉行)內聲明時,它在末尾看不到(它不存在於該循環的塊外部)。最後一行然後是指在那裏創建的全球@arr,它從未被分配到。我們確實得到警告

 
Possible unintended interpolation of @arr in string at scope.pl line 11. 
Name "main::arr" used only once: possible typo at scope.pl line 11. 

約用了一次空main::arr,並打印,因爲它的空行。

Private variables via my() in perlsub

+0

參見「*首次使用時,它創建*」 - 技術上解析器創建它當它第一次看到,不一定使用(例如'如果(0){打印@arr;}'將)在編譯時創建'@main :: arr'(假設'no strict'))。 – melpomene

+0

@melpomene好點,我剛剛考慮改變它(同時做一個小編輯)!問題是,我被問到關於「_seen_」的使用問題(指編譯器「看到」符號,我認爲這是絕對清楚的)...現在改變了它,謝謝:) – zdim