4
# my @arr;
for (1..100)
{
for (1..100)
{
for (1..100)
{
push @arr, 1;
}
}
}
@arr
的範圍是什麼?它是否與在頂部的註釋行中聲明的一樣?什麼範圍是深度代碼中使用的未聲明變量?
# my @arr;
for (1..100)
{
for (1..100)
{
for (1..100)
{
push @arr, 1;
}
}
}
@arr
的範圍是什麼?它是否與在頂部的註釋行中聲明的一樣?什麼範圍是深度代碼中使用的未聲明變量?
@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
,並打印,因爲它的空行。
參見「*首次使用時,它創建*」 - 技術上解析器創建它當它第一次看到,不一定使用(例如'如果(0){打印@arr;}'將)在編譯時創建'@main :: arr'(假設'no strict'))。 – melpomene
@melpomene好點,我剛剛考慮改變它(同時做一個小編輯)!問題是,我被問到關於「_seen_」的使用問題(指編譯器「看到」符號,我認爲這是絕對清楚的)...現在改變了它,謝謝:) – zdim