2014-12-06 34 views
0

在Perl中,如果您在聲明子例程後試圖用my從詞法上聲明變量,則此子例程將看不到此變量。然而,子程序聲明後,變量將看到變量:在定義子程序之後定義詞法變量

sub lol { 
    if (@arr) { 
     print "defined\n"; 
    } else { 
     print "not defined\n"; 
    } 
} 
my @arr = (1,2,3); 
sub lol2 { 
    if (@arr) { 
     print "defined\n"; 
    } else { 
     print "not defined\n"; 
    } 
} 
lol; #prints "not defined" 
lol2; #prints "defined" 

但是,如果您設置一個變量未聲明的(@arr = (1,2,3);)或our聲明變量,子程序都將看到變量。

它是一個錯誤或功能?

+0

這個部分你的問題:「然而,如果你聲明,如果你設置值爲變量沒有宣佈「很難理解。 – asjo 2014-12-06 16:25:53

+0

@asjo哦,沒有注意到,對不起,剛剛更正 – Vantuz 2014-12-06 16:27:41

+1

很酷,現在更容易理解。如果你「嚴格使用;使用警告;」你必須在使用它們之前聲明所有的變量,這將更容易避免錯誤。它按預期工作。 – asjo 2014-12-06 16:30:21

回答

1

所有未用my定義的變量隱含地爲our(全局/程序包)變量。所以這是一個功能。 use strict;編譯指示將強制您在變量聲明中明確使用ourmy

更確切地說,報價從perldoc

嚴格瓦爾

,如果你訪問既沒有明確地表明(使用我的任何一個變量這將產生一個編譯時錯誤,我們的,州或使用變量),也不完全合格。 (因爲這是爲了避免可變的自殺問題和微妙的動態範圍問題,僅僅局部變量不夠好。)

+0

但是這兩個子程序和數組都在相同的範圍內聲明,對吧? – Vantuz 2014-12-06 16:31:27

+0

'嚴格'不會強迫你使用'我們'或'我的'。它強制你指定明確的包名稱。除非使用'our'或'my'在當前範圍內聲明變量。考慮'perl -Mstrict -lwe'$ main :: x = 0;'' – TLP 2014-12-06 16:34:17

+0

@mpapec子例程繼承範圍,對不對?子例程和數組都是在相同的範圍內定義的,所以數組應該在兩個子例程中都可見。我仍然不明白爲什麼只有一個子程序才能看到它。 – Vantuz 2014-12-06 16:39:13