“our”,"把名字限於某個範圍“,其實就是明確聲明一個"全域變數",雖然是在某個模組或者函數裡面定義的,外面的也可以訪問,如果已經聲明過了,再次用"our",表示此處用的是全域的那個,不是同名的私人或者局部變數 our $PROGRAM_NAME = "waiter"; { my $PROGRAM_NAME = "something"; our $PROGRAM_NAME = "server"; #這裡的our和外面的相同,和前句不同。 # 這裡調用的代碼看到的是"server" } # 這裡執行的代碼看到的仍然是"server". “my” ,"把名字和值都限於限於某個範圍",簡單說,就是只能本層模組或者函數可以看到這個變數,高一層的或者低一層的都看不到的。 sub greeting1{ my ($hello) = "How are you do?"; greeting2(); } sub greeting2{ print "$hello/n"; } $hello = "How are you doing?"; greeting2(); greeting1(); greeting2(); 運行結果: How are you doing? How are you doing? How are you doing? -------------------------- 一個 How are you do? 都沒有,在greeting1中call greeting2時,greeting2看不到greeting1的私人 $hello變數,只能看到外面的全域變數$hello “local”,"把值局限於某個範圍",也有叫"動態詞法範圍",有點不好懂。我的理解,就是本層和本層下層的函數可以看到本層的變數,但是本層上一層的不可以。到底範圍是多少,不僅取決於本層的函數,還要看下一層的程式長度和深度,所以叫"動態範圍"。 sub greeting1{ local ($hello) = "How are you do?"; greeting2(); } sub greeting2{ print "$hello/n"; } $hello = "How are you doing?"; greeting2(); greeting1(); greeting2(); 運行結果: How are you doing? How are you do? How are you doing? ----------------------- 跟用 my 時不一樣了吧? 此時在greeting1調用greeting2時,greeting2可以看到greeting1的局部變數$hello,外部的全域變數當然就隱藏了。 |